diff --git a/.gitignore b/.gitignore index 723ef36f..30de240b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.idea \ No newline at end of file +.idea +logs +*.log \ No newline at end of file diff --git a/apps/user-service/build.gradle b/apps/user-service/build.gradle index e3edefa5..208bd2b5 100644 --- a/apps/user-service/build.gradle +++ b/apps/user-service/build.gradle @@ -19,6 +19,10 @@ configurations { compileOnly { extendsFrom annotationProcessor } + // Spring Boot의 기본 로깅(Logback) 제외 + all { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' + } } repositories { @@ -26,15 +30,35 @@ repositories { } dependencies { + // Spring Boot Starters implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5' implementation 'org.springframework.boot:spring-boot-starter-aop' + + // MyBatis + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5' + + // 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 'com.lmax:disruptor:3.4.4' + + // Lombok compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + // Database runtimeOnly 'com.h2database:h2' runtimeOnly 'org.postgresql:postgresql' - annotationProcessor 'org.projectlombok:lombok' + + // Test Dependencies testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-testcontainers' testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.5' diff --git a/apps/user-service/src/main/resources/application-develop.yml b/apps/user-service/src/main/resources/application-develop.yml index e6d842e0..fb8125bd 100644 --- a/apps/user-service/src/main/resources/application-develop.yml +++ b/apps/user-service/src/main/resources/application-develop.yml @@ -33,4 +33,7 @@ spring: use_sql_comments: true jdbc: lob: - non_contextual_creation: true \ No newline at end of file + non_contextual_creation: true + +logging: + config: classpath:log4j2-develop.yml \ No newline at end of file diff --git a/apps/user-service/src/main/resources/log4j2-develop.yml b/apps/user-service/src/main/resources/log4j2-develop.yml new file mode 100644 index 00000000..4734a1ce --- /dev/null +++ b/apps/user-service/src/main/resources/log4j2-develop.yml @@ -0,0 +1,126 @@ +Configuration: + name: develop + + properties: + property: + - name: "log-path" + value: "./logs" + - name: "charset-UTF-8" + value: "UTF-8" + # 통일된 콘솔 패턴 - 모든 로그에 RequestId 포함 + - name: "console-layout-pattern" + value: "%highlight{[%-5level]} [%X{id}] %d{MM-dd HH:mm:ss} [%t] %n %msg%n%n" + # 파일용 상세 패턴 - RequestId 포함 + - name: "file-layout-pattern" + value: "[%X{id}] %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: "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 + + # [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" + + # 파일 로그들 + File: + - name: file-info-appender + fileName: ${info-log} + PatternLayout: + pattern: ${file-layout-pattern} + - 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} + + # [Loggers] 로그 출력 범위를 정의 + Loggers: + # [Loggers - Root] 모든 로그를 기록하는 최상위 로그를 정의 + Root: + level: OFF + AppenderRef: + - ref: console-appender + - ref: rolling-file-appender + + # [Loggers - Loggers] 특정 패키지나 클래스에 대한 로그를 정의 + Logger: + # 1. Spring Framework 로그 + - name: org.springframework + additivity: "false" + level: DEBUG + AppenderRef: + - ref: console-appender + - ref: file-info-appender + - ref: file-error-appender + + # 2. 애플리케이션 로그 + - name: com.movement.mvp + additivity: "false" + level: TRACE + AppenderRef: + - ref: console-appender + - ref: file-info-appender + - ref: file-error-appender + + # 3. HikariCP 로그 비활성화 + - name: com.zaxxer.hikari + level: OFF + + # 4. Spring Security 로그 - 인증/인가 추적에 중요 + - name: org.springframework.security + level: DEBUG + additivity: "false" + AppenderRef: + - ref: console-appender + - ref: file-auth-appender + + # 5. 웹 요청 로그 - 요청 처리 과정 추적 + - name: org.springframework.web + level: DEBUG + additivity: "false" + AppenderRef: + - ref: console-appender + - ref: file-info-appender + + # 6. 트랜잭션 로그 - DB 작업 추적 + - name: org.springframework.transaction + level: DEBUG + additivity: "false" + AppenderRef: + - ref: console-appender + - ref: file-info-appender \ No newline at end of file diff --git a/apps/user-service/src/main/resources/log4j2-test.yml b/apps/user-service/src/main/resources/log4j2-test.yml new file mode 100644 index 00000000..40f7ead9 --- /dev/null +++ b/apps/user-service/src/main/resources/log4j2-test.yml @@ -0,0 +1,78 @@ +Configuration: + name: test + + properties: + property: + - name: "log-path" + value: "./logs" + - name: "charset-UTF-8" + value: "UTF-8" + # 통일된 콘솔 패턴 - 모든 로그에 RequestId 포함 + - name: "console-layout-pattern" + value: "%highlight{[%-5level]} [%X{id}] %d{MM-dd HH:mm:ss} [%t] %n %msg%n%n" + + # [Appenders] 로그 기록방식 정의 + Appenders: + # 통일된 콘솔 출력 + Console: + name: console-appender + target: SYSTEM_OUT + PatternLayout: + pattern: ${console-layout-pattern} + + # [Loggers] 로그 출력 범위를 정의 + Loggers: + # [Loggers - Root] 모든 로그를 기록하는 최상위 로그를 정의 + Root: + level: OFF + AppenderRef: + - ref: console-appender + - ref: rolling-file-appender + + # [Loggers - Loggers] 특정 패키지나 클래스에 대한 로그를 정의 + Logger: + # 1. Spring Framework 로그 + - name: org.springframework + additivity: "false" + level: INFO + AppenderRef: + - ref: console-appender + - ref: file-info-appender + - ref: file-error-appender + + # 2. 애플리케이션 로그 + - name: com.movement + additivity: "false" + level: INFO + AppenderRef: + - ref: console-appender + - ref: file-info-appender + - ref: file-error-appender + + # 3. HikariCP 로그 비활성화 + - name: com.zaxxer.hikari + level: OFF + + # 4. Spring Security 로그 - 인증/인가 추적에 중요 + - name: org.springframework.security + level: INFO + additivity: "false" + AppenderRef: + - ref: console-appender + - ref: file-auth-appender + + # 5. 웹 요청 로그 - 요청 처리 과정 추적 + - name: org.springframework.web + level: INFO + additivity: "false" + AppenderRef: + - ref: console-appender + - ref: file-info-appender + + # 6. 트랜잭션 로그 - DB 작업 추적 + - name: org.springframework.transaction + level: INFO + additivity: "false" + AppenderRef: + - ref: console-appender + - ref: file-info-appender \ No newline at end of file