diff --git a/apps/user-service/build.gradle b/apps/user-service/build.gradle index d2ffcb1e..8aa7715a 100644 --- a/apps/user-service/build.gradle +++ b/apps/user-service/build.gradle @@ -63,6 +63,10 @@ dependencies { // 비동기 로깅 implementation 'com.lmax:disruptor:3.4.4' + implementation "io.micrometer:micrometer-tracing-bridge-brave" + implementation "io.micrometer:micrometer-tracing" + implementation "org.springframework.boot:spring-boot-starter-actuator" + // Lombok compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30' diff --git a/apps/user-service/src/main/java/site/icebang/global/filter/LoggingFilter.java b/apps/user-service/src/main/java/site/icebang/global/filter/LoggingFilter.java deleted file mode 100644 index 0a782839..00000000 --- a/apps/user-service/src/main/java/site/icebang/global/filter/LoggingFilter.java +++ /dev/null @@ -1,44 +0,0 @@ -package site.icebang.global.filter; - -import java.io.IOException; -import java.util.UUID; - -import org.slf4j.MDC; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -@Component -public class LoggingFilter extends OncePerRequestFilter { - - public static final String TRACE_ID_HEADER = "X-Request-ID"; - - @Override - protected void doFilterInternal( - HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - - // 다른 시스템에서 이미 전달한 Trace ID가 있는지 확인 - String traceId = request.getHeader(TRACE_ID_HEADER); - - // 없다면 새로 생성 (요청의 시작점) - if (traceId == null || traceId.isEmpty()) { - traceId = UUID.randomUUID().toString(); - } - - // MDC.put("traceId", traceId.substring(0, 8)); - MDC.put("traceId", traceId); - - // ⭐️ 요청 객체에 attribute로 traceId를 저장하여 컨트롤러 등에서 사용할 수 있게 함 - request.setAttribute("X-Request-ID", traceId); - - // 응답 헤더에 traceId를 넣어주면 클라이언트가 추적하기 용이 - response.setHeader(TRACE_ID_HEADER, traceId); - - filterChain.doFilter(request, response); - } -} diff --git a/apps/user-service/src/main/resources/application-develop.yml b/apps/user-service/src/main/resources/application-develop.yml index b8cb1648..8c24f49d 100644 --- a/apps/user-service/src/main/resources/application-develop.yml +++ b/apps/user-service/src/main/resources/application-develop.yml @@ -44,3 +44,9 @@ mybatis: logging: config: classpath:log4j2-develop.yml + +management: + tracing: + enabled: true + sampling: + probability: 1.0 # 100% 샘플링 (개발 환경에서만 권장) \ 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 index 5303e6ff..69833c98 100644 --- a/apps/user-service/src/main/resources/log4j2-develop.yml +++ b/apps/user-service/src/main/resources/log4j2-develop.yml @@ -5,46 +5,142 @@ Configuration: properties: property: - name: "app-name" - value: "${env:APP_NAME:-user-service-app}" + value: "user-service" + - name: "log-path" + value: "./logs" + - name: "charset-UTF-8" + value: "UTF-8" + # DEBUG 환경용 콘솔 패턴 - 더 간단하고 가독성 좋게 + - name: "console-layout-pattern" + value: "%highlight{[%-5level]} [%X{traceId}] [%X{spanId}] %d{HH:mm:ss} [%t] %n %logger{20} - %msg%n%n " + # 파일용 패턴 + - name: "file-layout-pattern" + value: "[%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" + # 개발 환경용 로그 파일들 + - name: "dev-log" + value: ${log-path}/develop/app.log + - name: "error-log" + value: ${log-path}/develop/error.log Appenders: - # 콘솔 appender + # 콘솔 출력 - 개발 시 주요 출력 Console: name: console-appender target: SYSTEM_OUT PatternLayout: - pattern: "[%-5level] [%X{traceId}] %d{MM-dd HH:mm:ss} [%t] %msg%n" + pattern: ${console-layout-pattern} + disableAnsi: false - # Tjahzi Loki Appender (올바른 문법) + # Loki Appender - 개발환경 모니터링용 Loki: name: loki-appender host: localhost port: 3100 - PatternLayout: - pattern: "[%-5level] [%X{traceId}] %d{MM-dd HH:mm:ss} [%t] %msg%n" + JsonLayout: + compact: true + eventEol: true + includeStacktrace: true + KeyValuePair: + - key: "app" + value: "${app-name}" + - key: "env" + value: "develop" Label: - name: "app" - value: "${app-name}" # 고정 값 - - name: "service" - value: "user-service" # 고정 값 + value: "${app-name}" + - name: "env" + value: "develop" - name: "traceId" - value: "${ctx:traceId}" # MDC에서 가져올 값만 넣음 + value: "${ctx:traceId}" + - name: "spanId" + value: "${ctx:spanId}" + - name: "executionType" + value: "${ctx:executionType:-application}" + - name: "sourceId" + value: "${ctx:sourceId}" + - name: "runId" + value: "${ctx:runId}" + + # 개발용 일반 로그 파일 + File: + - name: file-dev-appender + fileName: ${dev-log} + PatternLayout: + pattern: ${file-layout-pattern} + - name: file-error-appender + fileName: ${error-log} + PatternLayout: + pattern: ${file-layout-pattern} + ThresholdFilter: + level: ERROR Loggers: + # Root 로거 - 개발환경에서는 기본적으로 INFO 레벨 Root: level: INFO AppenderRef: - ref: console-appender Logger: - # 애플리케이션 로그만 Loki로 전송 (additivity 문법 수정) + # 애플리케이션 로그 - 개발 시 모든 레벨 + Loki 전송 - name: site.icebang + additivity: false + level: DEBUG + AppenderRef: + - ref: console-appender + - ref: loki-appender + - ref: file-dev-appender + - ref: file-error-appender + + # Spring Framework - 개발 시 필요한 정보만 + - name: org.springframework additivity: false level: INFO AppenderRef: - ref: console-appender + - ref: file-dev-appender + + # Spring Security - 인증 디버깅용 + - name: org.springframework.security + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + - ref: file-dev-appender + - ref: loki-appender + + # 웹 요청 로그 - API 개발 시 유용 + - name: org.springframework.web + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + - ref: file-dev-appender + - ref: loki-appender + + # 트랜잭션 로그 - DB 작업 디버깅 + - name: org.springframework.transaction + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + - ref: file-dev-appender - ref: loki-appender # HikariCP 로그 비활성화 - name: com.zaxxer.hikari - level: OFF \ No newline at end of file + level: OFF + + # SQL 로그 - 개발 시 쿼리 확인용 (필요시 활성화) + - name: org.hibernate.SQL + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + + # 파라미터 바인딩 로그 (필요시 활성화) + - name: org.hibernate.type.descriptor.sql.BasicBinder + level: TRACE + additivity: false + AppenderRef: + - ref: console-appender \ No newline at end of file diff --git a/apps/user-service/src/main/resources/log4j2-production.yml b/apps/user-service/src/main/resources/log4j2-production.yml index 31393458..2e7d282b 100644 --- a/apps/user-service/src/main/resources/log4j2-production.yml +++ b/apps/user-service/src/main/resources/log4j2-production.yml @@ -1,5 +1,5 @@ Configuration: - name: develop + name: production properties: property: