From b7aaef8bddb207bb34b13db695fe0d6769ca1f6a Mon Sep 17 00:00:00 2001 From: can019 Date: Tue, 16 Sep 2025 17:54:05 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20Workflow=20history=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4=EC=8A=A4=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user-service/build.gradle | 14 ++-- .../site/icebang/domain/TestController.java | 34 +++++++++ .../aop/logging/WorkflowLoggingAspect.java | 3 + .../security/endpoints/SecurityEndpoints.java | 3 +- .../exception/GlobalExceptionHandler.java | 3 +- .../service/DynamicSchedulerService.java | 51 ++++++------- .../src/main/resources/log4j2-develop.yml | 76 +++++++++++-------- 7 files changed, 114 insertions(+), 70 deletions(-) create mode 100644 apps/user-service/src/main/java/site/icebang/domain/TestController.java create mode 100644 apps/user-service/src/main/java/site/icebang/global/aop/logging/WorkflowLoggingAspect.java diff --git a/apps/user-service/build.gradle b/apps/user-service/build.gradle index 8aa7715a..29f095ea 100644 --- a/apps/user-service/build.gradle +++ b/apps/user-service/build.gradle @@ -47,21 +47,17 @@ dependencies { // batch implementation 'org.springframework.boot:spring-boot-starter-batch' - // Log4j2 - 모든 모듈을 2.22.1로 통일 implementation 'org.springframework.boot:spring-boot-starter-log4j2' - implementation 'org.apache.logging.log4j:log4j-core:2.22.1' - implementation 'org.apache.logging.log4j:log4j-api:2.22.1' - implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.22.1' - implementation 'org.apache.logging.log4j:log4j-jul:2.22.1' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml' - implementation 'org.apache.logging.log4j:log4j-layout-template-json:2.22.1' - + implementation 'org.apache.logging.log4j:log4j-layout-template-json' + implementation 'pl.tkowalcz.tjahzi:log4j2-appender-nodep:0.9.17' implementation 'org.apache.httpcomponents:httpclient:4.5.14' implementation 'org.apache.httpcomponents:httpcore:4.4.16' - implementation 'pl.tkowalcz.tjahzi:log4j2-appender-nodep:0.9.17' // 비동기 로깅 - implementation 'com.lmax:disruptor:3.4.4' +// implementation 'com.lmax:disruptor:3.4.4' +// implementation 'org.apache.commons:commons-dbcp2' +// implementation 'org.apache.commons:commons-pool2' implementation "io.micrometer:micrometer-tracing-bridge-brave" implementation "io.micrometer:micrometer-tracing" diff --git a/apps/user-service/src/main/java/site/icebang/domain/TestController.java b/apps/user-service/src/main/java/site/icebang/domain/TestController.java new file mode 100644 index 00000000..e86ace85 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/domain/TestController.java @@ -0,0 +1,34 @@ +package site.icebang.domain; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.extern.slf4j.Slf4j; + +import site.icebang.common.dto.ApiResponse; + +@RestController +@RequestMapping("/v0/hi") +@Slf4j +public class TestController { + private static final Logger workflowLogger = LoggerFactory.getLogger("WORKFLOW_HISTORY"); + + @GetMapping("") + public ApiResponse test() { + log.info("@@"); + // MDC.put("traceId", UUID.randomUUID().toString()); + MDC.put("sourceId", "o1"); + MDC.put("executionType", "WORKFLOW"); + // MDC.put("sourceId", "test-controller"); + + // 이 로그는 DB에 저장됨 + workflowLogger.info("SLF4J로 찍은 워크플로우 로그"); + + MDC.clear(); + return ApiResponse.success("hi"); + } +} diff --git a/apps/user-service/src/main/java/site/icebang/global/aop/logging/WorkflowLoggingAspect.java b/apps/user-service/src/main/java/site/icebang/global/aop/logging/WorkflowLoggingAspect.java new file mode 100644 index 00000000..8e2d26c3 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/global/aop/logging/WorkflowLoggingAspect.java @@ -0,0 +1,3 @@ +package site.icebang.global.aop.logging; + +public class WorkflowLoggingAspect {} diff --git a/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java b/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java index 019337dc..b2474243 100644 --- a/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java +++ b/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java @@ -11,7 +11,8 @@ public enum SecurityEndpoints { "/js/**", "/images/**", "/v0/organizations/**", - "/v0/auth/register"), + "/v0/auth/register", + "/v0/hi"), // 데이터 관리 관련 엔드포인트 DATA_ADMIN("/admin/**", "/api/admin/**", "/management/**", "/actuator/**"), diff --git a/apps/user-service/src/main/java/site/icebang/global/handler/exception/GlobalExceptionHandler.java b/apps/user-service/src/main/java/site/icebang/global/handler/exception/GlobalExceptionHandler.java index 6923f455..4eba15ae 100644 --- a/apps/user-service/src/main/java/site/icebang/global/handler/exception/GlobalExceptionHandler.java +++ b/apps/user-service/src/main/java/site/icebang/global/handler/exception/GlobalExceptionHandler.java @@ -24,8 +24,7 @@ public ApiResponse handleValidation(MethodArgumentNotValidException ex) @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ApiResponse handleGeneric(Exception ex) { - return ApiResponse.error( - "Internal error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + return ApiResponse.error("Internal error: ", HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(NoResourceFoundException.class) diff --git a/apps/user-service/src/main/java/site/icebang/schedule/service/DynamicSchedulerService.java b/apps/user-service/src/main/java/site/icebang/schedule/service/DynamicSchedulerService.java index b81e30eb..b78c048e 100644 --- a/apps/user-service/src/main/java/site/icebang/schedule/service/DynamicSchedulerService.java +++ b/apps/user-service/src/main/java/site/icebang/schedule/service/DynamicSchedulerService.java @@ -1,16 +1,12 @@ package site.icebang.schedule.service; -import java.time.LocalDateTime; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.TaskScheduler; -import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -30,29 +26,30 @@ public class DynamicSchedulerService { public void register(Schedule schedule) { // TODO: schedule.getWorkflowId()를 기반으로 실행할 Job의 이름을 DB에서 조회 - String jobName = "blogContentJob"; // 예시 - Job jobToRun = applicationContext.getBean(jobName, Job.class); - - Runnable runnable = - () -> { - try { - JobParametersBuilder paramsBuilder = new JobParametersBuilder(); - paramsBuilder.addString("runAt", LocalDateTime.now().toString()); - paramsBuilder.addLong("scheduleId", schedule.getScheduleId()); - jobLauncher.run(jobToRun, paramsBuilder.toJobParameters()); - } catch (Exception e) { - log.error( - "Failed to run scheduled job for scheduleId: {}", schedule.getScheduleId(), e); - } - }; - - CronTrigger trigger = new CronTrigger(schedule.getCronExpression()); - ScheduledFuture future = taskScheduler.schedule(runnable, trigger); - scheduledTasks.put(schedule.getScheduleId(), future); - log.info( - ">>>> Schedule registered: id={}, cron={}", - schedule.getScheduleId(), - schedule.getCronExpression()); + // String jobName = "blogContentJob"; // 예시 + // Job jobToRun = applicationContext.getBean(jobName, Job.class); + // + // Runnable runnable = + // () -> { + // try { + // JobParametersBuilder paramsBuilder = new JobParametersBuilder(); + // paramsBuilder.addString("runAt", LocalDateTime.now().toString()); + // paramsBuilder.addLong("scheduleId", schedule.getScheduleId()); + // jobLauncher.run(jobToRun, paramsBuilder.toJobParameters()); + // } catch (Exception e) { + // log.error( + // "Failed to run scheduled job for scheduleId: {}", schedule.getScheduleId(), + // e); + // } + // }; + // + // CronTrigger trigger = new CronTrigger(schedule.getCronExpression()); + // ScheduledFuture future = taskScheduler.schedule(runnable, trigger); + // scheduledTasks.put(schedule.getScheduleId(), future); + // log.info( + // ">>>> Schedule registered: id={}, cron={}", + // schedule.getScheduleId(), + // schedule.getCronExpression()); } public void remove(Long scheduleId) { diff --git a/apps/user-service/src/main/resources/log4j2-develop.yml b/apps/user-service/src/main/resources/log4j2-develop.yml index 41a369bf..9901930c 100644 --- a/apps/user-service/src/main/resources/log4j2-develop.yml +++ b/apps/user-service/src/main/resources/log4j2-develop.yml @@ -29,7 +29,7 @@ Configuration: target: SYSTEM_OUT PatternLayout: pattern: ${console-layout-pattern} - disableAnsi: false +# disableAnsi: false # Loki Appender - 개발환경 모니터링용 Loki: @@ -60,31 +60,35 @@ Configuration: value: "${ctx:sourceId}" - name: "runId" value: "${ctx:runId}" + JDBC: + name: workflow-appender + tableName: "execution_log" + bufferSize: 0 + ignoreExceptions: false -# ExecutionDB: -# name: ExecutionDB -# class: org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender -# tableName: execution_log -# columnMappings: -# - name: log_level -# pattern: "%level" -# - name: log_message -# pattern: "%message" -# - name: trace_id -# pattern: "%X{traceId}" -# - name: execution_type -# pattern: "%X{executionType}" -# - name: source_id -# pattern: "%X{sourceId}" -# - name: run_id -# pattern: "%X{runId}" -# - name: executed_at -# pattern: "%d{yyyy-MM-dd HH:mm:ss}" -# connectionSource: -# class: org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource -# dataSource: "#dataSource + DriverManager: + connectionString: "jdbc:mariadb://localhost:3306/pre_process" + driverClassName: "org.mariadb.jdbc.Driver" + userName: "mariadb" + password: "qwer1234" - # 개발용 일반 로그 파일 + ColumnMapping: + - name: "execution_type" + pattern: "%X{executionType}" + - name: "source_id" + pattern: "%X{sourceId}" + - name: "log_level" + pattern: "%level" + - name: "executed_at" + pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS}" # 패턴으로 시간 직접 지정 + - name: "log_message" + pattern: "%message" + - name: "trace_id" + pattern: "%X{traceId}" + - name: "reserved1" + pattern: "%X{spanId}" +# - name: "config_snapshot" +# pattern: "%X{configSnapshot}" File: - name: file-dev-appender fileName: ${dev-log} @@ -107,7 +111,7 @@ Configuration: Logger: # 애플리케이션 로그 - 개발 시 모든 레벨 + Loki 전송 - name: site.icebang - additivity: false + additivity: "false" level: DEBUG AppenderRef: - ref: console-appender @@ -115,9 +119,19 @@ Configuration: - ref: file-dev-appender - ref: file-error-appender + - name: "WORKFLOW_HISTORY" + level: DEBUG + additivity: "false" + AppenderRef: + - ref: workflow-appender + - ref: loki-appender + - ref: console-appender + - ref: file-dev-appender + - ref: file-error-appender + # Spring Framework - 개발 시 필요한 정보만 - name: org.springframework - additivity: false + additivity: "false" level: INFO AppenderRef: - ref: console-appender @@ -126,7 +140,7 @@ Configuration: # Spring Security - 인증 디버깅용 - name: org.springframework.security level: DEBUG - additivity: false + additivity: "false" AppenderRef: - ref: console-appender - ref: file-dev-appender @@ -135,7 +149,7 @@ Configuration: # 웹 요청 로그 - API 개발 시 유용 - name: org.springframework.web level: DEBUG - additivity: false + additivity: "false" AppenderRef: - ref: console-appender - ref: file-dev-appender @@ -144,7 +158,7 @@ Configuration: # 트랜잭션 로그 - DB 작업 디버깅 - name: org.springframework.transaction level: DEBUG - additivity: false + additivity: "false" AppenderRef: - ref: console-appender - ref: file-dev-appender @@ -157,13 +171,13 @@ Configuration: # SQL 로그 - 개발 시 쿼리 확인용 (필요시 활성화) - name: org.hibernate.SQL level: DEBUG - additivity: false + additivity: "false" AppenderRef: - ref: console-appender # 파라미터 바인딩 로그 (필요시 활성화) - name: org.hibernate.type.descriptor.sql.BasicBinder level: TRACE - additivity: false + additivity: "false" AppenderRef: - ref: console-appender \ No newline at end of file From 105ed688f69d4239efaf79a930e187e1c8987347 Mon Sep 17 00:00:00 2001 From: can019 Date: Tue, 16 Sep 2025 20:06:45 +0900 Subject: [PATCH 2/4] =?UTF-8?q?chore:=20e2e=20test=20logger=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85=20=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/log4j2-develop.yml | 2 +- .../src/main/resources/log4j2-test-e2e.yml | 63 ++++++++++++------- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/apps/user-service/src/main/resources/log4j2-develop.yml b/apps/user-service/src/main/resources/log4j2-develop.yml index 9901930c..8e68569b 100644 --- a/apps/user-service/src/main/resources/log4j2-develop.yml +++ b/apps/user-service/src/main/resources/log4j2-develop.yml @@ -166,7 +166,7 @@ Configuration: # HikariCP 로그 비활성화 - name: com.zaxxer.hikari - level: OFF + level: "OFF" # SQL 로그 - 개발 시 쿼리 확인용 (필요시 활성화) - name: org.hibernate.SQL diff --git a/apps/user-service/src/main/resources/log4j2-test-e2e.yml b/apps/user-service/src/main/resources/log4j2-test-e2e.yml index 557f426b..53acccf2 100644 --- a/apps/user-service/src/main/resources/log4j2-test-e2e.yml +++ b/apps/user-service/src/main/resources/log4j2-test-e2e.yml @@ -34,7 +34,7 @@ Configuration: Loki: name: loki-appender host: localhost - port: ${sys:loki.port} + port: "${loki-port}" JsonLayout: compact: true eventEol: true @@ -60,28 +60,33 @@ Configuration: - name: "runId" value: "${ctx:runId}" -# ExecutionDB: -# name: ExecutionDB -# class: org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender -# tableName: execution_log -# columnMappings: -# - name: log_level -# pattern: "%level" -# - name: log_message -# pattern: "%message" -# - name: trace_id -# pattern: "%X{traceId}" -# - name: execution_type -# pattern: "%X{executionType}" -# - name: source_id -# pattern: "%X{sourceId}" -# - name: run_id -# pattern: "%X{runId}" -# - name: executed_at -# pattern: "%d{yyyy-MM-dd HH:mm:ss}" -# connectionSource: -# class: org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource -# dataSource: "#dataSource + JDBC: + name: workflow-appender + tableName: "execution_log" + bufferSize: 0 + ignoreExceptions: false + + DriverManager: + connectionString: ${DriverManager.connectionString} + driverClassName: ${DriverManager.driverClassName} + userName: ${DriverManager.userName} + password: ${DriverManager.password} + + ColumnMapping: + - name: "execution_type" + pattern: "%X{executionType}" + - name: "source_id" + pattern: "%X{sourceId}" + - name: "log_level" + pattern: "%level" + - name: "executed_at" + pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS}" # 패턴으로 시간 직접 지정 + - name: "log_message" + pattern: "%message" + - name: "trace_id" + pattern: "%X{traceId}" + - name: "reserved1" + pattern: "%X{spanId}" # 개발용 일반 로그 파일 File: @@ -114,6 +119,16 @@ Configuration: - ref: file-dev-appender - ref: file-error-appender + - name: "WORKFLOW_HISTORY" + level: DEBUG + additivity: "false" + AppenderRef: + - ref: workflow-appender + - ref: loki-appender + - ref: console-appender + - ref: file-dev-appender + - ref: file-error-appender + # Spring Framework - 개발 시 필요한 정보만 - name: org.springframework additivity: false @@ -151,7 +166,7 @@ Configuration: # HikariCP 로그 비활성화 - name: com.zaxxer.hikari - level: OFF + level: "OFF" # SQL 로그 - 개발 시 쿼리 확인용 (필요시 활성화) - name: org.hibernate.SQL From 31bac6d6f46cfe9b4ef25832ea397a313f0cc774 Mon Sep 17 00:00:00 2001 From: can019 Date: Tue, 16 Sep 2025 20:09:53 +0900 Subject: [PATCH 3/4] =?UTF-8?q?chore:=20Workflow=20logging=20example=20con?= =?UTF-8?q?troller=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes to be committed: renamed: src/main/java/site/icebang/domain/TestController.java -> src/main/java/site/icebang/domain/WorkflowLogInsertExampleController.java --- ...ontroller.java => WorkflowLogInsertExampleController.java} | 4 ++-- .../global/config/security/endpoints/SecurityEndpoints.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename apps/user-service/src/main/java/site/icebang/domain/{TestController.java => WorkflowLogInsertExampleController.java} (90%) diff --git a/apps/user-service/src/main/java/site/icebang/domain/TestController.java b/apps/user-service/src/main/java/site/icebang/domain/WorkflowLogInsertExampleController.java similarity index 90% rename from apps/user-service/src/main/java/site/icebang/domain/TestController.java rename to apps/user-service/src/main/java/site/icebang/domain/WorkflowLogInsertExampleController.java index e86ace85..c3e225b7 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/TestController.java +++ b/apps/user-service/src/main/java/site/icebang/domain/WorkflowLogInsertExampleController.java @@ -12,9 +12,9 @@ import site.icebang.common.dto.ApiResponse; @RestController -@RequestMapping("/v0/hi") +@RequestMapping("/v0/check-execution-log-insert") @Slf4j -public class TestController { +public class WorkflowLogInsertExampleController { private static final Logger workflowLogger = LoggerFactory.getLogger("WORKFLOW_HISTORY"); @GetMapping("") diff --git a/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java b/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java index b2474243..16065d8e 100644 --- a/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java +++ b/apps/user-service/src/main/java/site/icebang/global/config/security/endpoints/SecurityEndpoints.java @@ -12,7 +12,7 @@ public enum SecurityEndpoints { "/images/**", "/v0/organizations/**", "/v0/auth/register", - "/v0/hi"), + "/v0/check-execution-log-insert"), // 데이터 관리 관련 엔드포인트 DATA_ADMIN("/admin/**", "/api/admin/**", "/management/**", "/actuator/**"), From 4899ded7e2f514eef971bc85923efb6b7b7fc9be Mon Sep 17 00:00:00 2001 From: can019 Date: Tue, 16 Sep 2025 20:13:34 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore:=20Production=20workflow=20log=20(RDB?= =?UTF-8?q?)=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/log4j2-production.yml | 200 ++++++++++++------ 1 file changed, 134 insertions(+), 66 deletions(-) diff --git a/apps/user-service/src/main/resources/log4j2-production.yml b/apps/user-service/src/main/resources/log4j2-production.yml index 2e7d282b..455b2f22 100644 --- a/apps/user-service/src/main/resources/log4j2-production.yml +++ b/apps/user-service/src/main/resources/log4j2-production.yml @@ -1,126 +1,194 @@ Configuration: + status: INFO name: production properties: property: + - name: "app-name" + value: "user-service" - name: "log-path" value: "./logs" - name: "charset-UTF-8" value: "UTF-8" - # 통일된 콘솔 패턴 - 모든 로그에 RequestId 포함 + # 프로덕션 환경용 콘솔 패턴 - 구조화된 로그 - name: "console-layout-pattern" - value: "%highlight{[%-5level]} [%X{traceId}] %d{MM-dd HH:mm:ss} [%t] %n %msg%n%n" - # 파일용 상세 패턴 - RequestId 포함 + value: "%highlight{[%-5level]} [%X{traceId}] [%X{spanId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" + # 파일용 패턴 - name: "file-layout-pattern" value: "[%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" - # 로그 파일 경로들 - - name: "info-log" - value: ${log-path}/user-service/info.log + # 프로덕션 환경용 로그 파일들 + - name: "prod-log" + value: ${log-path}/production/app.log - name: "error-log" - value: ${log-path}/user-service/error.log - - name: "auth-log" - value: ${log-path}/user-service/auth.log - - name: "json-log" - value: ${log-path}/user-service/json-info.log + value: ${log-path}/production/error.log - # [Appenders] 로그 기록방식 정의 Appenders: - # 통일된 콘솔 출력 + # 콘솔 출력 - 프로덕션에서는 최소한의 정보만 Console: name: console-appender target: SYSTEM_OUT PatternLayout: pattern: ${console-layout-pattern} - # 롤링 파일 로그 - RollingFile: - name: rolling-file-appender - fileName: ${log-path}/rolling-file.log - filePattern: "logs/archive/rolling-file.log.%d{yyyy-MM-dd-hh-mm}_%i.gz" - PatternLayout: - charset: ${charset-UTF-8} - pattern: ${file-layout-pattern} - Policies: - SizeBasedTriggeringPolicy: - size: "200KB" - TimeBasedTriggeringPolicy: - interval: "1" - DefaultRollOverStrategy: - max: "30" - fileIndex: "max" - - # 파일 로그들 + # Loki Appender - 프로덕션 모니터링용 + Loki: + name: loki-appender + host: localhost + port: 3100 + JsonLayout: + compact: true + eventEol: true + includeStacktrace: true + KeyValuePair: + - key: "app" + value: "${app-name}" + - key: "env" + value: "production" + Label: + - name: "app" + value: "${app-name}" + - name: "env" + value: "production" + - name: "traceId" + value: "${ctx:traceId}" + - name: "spanId" + value: "${ctx:spanId}" + - name: "executionType" + value: "${ctx:executionType:-application}" + - name: "sourceId" + value: "${ctx:sourceId}" + - name: "runId" + value: "${ctx:runId}" + + JDBC: + name: workflow-appender + tableName: "execution_log" + bufferSize: 0 + ignoreExceptions: false + + DriverManager: + connectionString: "jdbc:mariadb://${env:DB_HOST}:${env:DB_PORT}/${env:DB_NAME}" + driverClassName: "org.mariadb.jdbc.Driver" + userName: "${env:DB_USER}" + password: "${env:DB_PASS}" + + ColumnMapping: + - name: "execution_type" + pattern: "%X{executionType}" + - name: "source_id" + pattern: "%X{sourceId}" + - name: "log_level" + pattern: "%level" + - name: "executed_at" + pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS}" + - name: "log_message" + pattern: "%message" + - name: "trace_id" + pattern: "%X{traceId}" + - name: "reserved1" + pattern: "%X{spanId}" + File: - - name: file-info-appender - fileName: ${info-log} + - name: file-prod-appender + fileName: ${prod-log} PatternLayout: pattern: ${file-layout-pattern} + # 로그 파일 롤링 설정 + Policies: + TimeBasedTriggeringPolicy: + interval: 1 + modulate: true + SizeBasedTriggeringPolicy: + size: "100 MB" + DefaultRolloverStrategy: + max: 30 + filePattern: ${log-path}/production/app.%d{yyyy-MM-dd}.%i.log + - name: file-error-appender fileName: ${error-log} PatternLayout: pattern: ${file-layout-pattern} - - name: file-auth-appender - fileName: ${auth-log} - PatternLayout: - pattern: ${file-layout-pattern} - - name: file-json-info-appender - fileName: ${json-log} - PatternLayout: - pattern: ${file-layout-pattern} + ThresholdFilter: + level: ERROR + Policies: + TimeBasedTriggeringPolicy: + interval: 1 + modulate: true + SizeBasedTriggeringPolicy: + size: "100 MB" + DefaultRolloverStrategy: + max: 30 + filePattern: ${log-path}/production/error.%d{yyyy-MM-dd}.%i.log - # [Loggers] 로그 출력 범위를 정의 Loggers: - # [Loggers - Root] 모든 로그를 기록하는 최상위 로그를 정의 + # Root 로거 - 프로덕션에서는 WARN 레벨 Root: - level: OFF + level: WARN AppenderRef: - ref: console-appender - - ref: rolling-file-appender - # [Loggers - Loggers] 특정 패키지나 클래스에 대한 로그를 정의 Logger: - # 1. Spring Framework 로그 - - name: org.springframework + # 애플리케이션 로그 - 프로덕션에서는 INFO 레벨 + - name: site.icebang additivity: "false" - level: DEBUG + level: INFO AppenderRef: - ref: console-appender - - ref: file-info-appender + - ref: loki-appender + - ref: file-prod-appender - ref: file-error-appender - # 2. 애플리케이션 로그 - - name: site.icebang + - name: "WORKFLOW_HISTORY" + level: INFO additivity: "false" - level: TRACE AppenderRef: + - ref: workflow-appender + - ref: loki-appender - ref: console-appender - - ref: file-info-appender + - ref: file-prod-appender - ref: file-error-appender - # 3. HikariCP 로그 비활성화 - - name: com.zaxxer.hikari - level: OFF + # Spring Framework - 프로덕션에서는 WARN 레벨 + - name: org.springframework + additivity: "false" + level: WARN + AppenderRef: + - ref: console-appender + - ref: file-prod-appender - # 4. Spring Security 로그 - 인증/인가 추적에 중요 + # Spring Security - 프로덕션에서는 WARN 레벨 - name: org.springframework.security - level: DEBUG + level: WARN additivity: "false" AppenderRef: - ref: console-appender - - ref: file-auth-appender + - ref: file-prod-appender - # 5. 웹 요청 로그 - 요청 처리 과정 추적 + # 웹 요청 로그 - 프로덕션에서는 INFO 레벨 - name: org.springframework.web - level: DEBUG + level: INFO additivity: "false" AppenderRef: - ref: console-appender - - ref: file-info-appender + - ref: file-prod-appender + - ref: loki-appender - # 6. 트랜잭션 로그 - DB 작업 추적 + # 트랜잭션 로그 - 프로덕션에서는 WARN 레벨 - name: org.springframework.transaction - level: DEBUG + level: WARN additivity: "false" AppenderRef: - ref: console-appender - - ref: file-info-appender \ No newline at end of file + - ref: file-prod-appender + + # HikariCP 로그 비활성화 + - name: com.zaxxer.hikari + level: "OFF" + + # SQL 로그 비활성화 - 프로덕션에서는 성능상 비활성화 + - name: org.hibernate.SQL + level: "OFF" + + # 파라미터 바인딩 로그 비활성화 + - name: org.hibernate.type.descriptor.sql.BasicBinder + level: "OFF" \ No newline at end of file