-
Logback 구현 - 2[공부] 프로그래밍/Spring・Spring Boot (JAVA) 2024. 5. 23. 15:12
♧ 전체 코드 : https://github.com/woodisco/spring-logbackGitHub - woodisco/spring-logback: Spring Logback 공부
Spring Logback 공부. Contribute to woodisco/spring-logback development by creating an account on GitHub.
github.com
MDC 구현
멀티스레드 환경에서 로드를 남길 때 사용하는 개념
로그 관리 시스템에서 사용되는 개념으로, 각 스레드에 특정한 진단 정보를 저장하고 이를 로그 메시지에 자동으로 포함시키는 기능을 제공합니다. MDC는 주로 Java의 로깅 프레임워크인 Log4j, SLF4J, Logback 등에서 사용됩니다.
▷ MDC의 주요 개념
・ 스레드 별 진단 정보:
MDC는 각 스레드에 독립적인 진단 정보를 저장합니다. 예를 들어, 웹 애플리케이션에서 각 요청을 처리하는 스레드는 고유한 요청 ID를 가질 수 있으며, 이 요청 ID를 MDC에 저장할 수 있습니다.
・ 자동 로그 추가:
로그 메시지를 기록할 때, MDC에 저장된 진단 정보가 자동으로 로그 메시지에 추가됩니다. 이를 통해 로그를 분석할 때 어떤 요청이나 사용자와 관련된 로그인지 쉽게 식별할 수 있습니다.① MdcController 작성
: put 이후에는 무조건 clear 해주기.@Slf4j @RestController public class MdcController { @GetMapping("/mdc") public String mdc() { MDC.put("job", "dev"); log.trace("log --> TRACE"); log.debug("log --> DEBUG"); log.info("log --> INFO"); log.warn("log --> WARN"); log.error("log --> ERROR"); MDC.clear(); return "mdc"; } }
② logback-spring-prod.xml 수정
: %X 를 사용하면 mdc안에 있는 값을 key로 조회할 수 있다.<appender name="MDC" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/mdc.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/archive/mdc.%d{yyyy-MM-dd}_%i.log</fileNamePattern> <maxFileSize>1KB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>[MDC] %X{job}%n</pattern> <outputPatternAsHeader>true</outputPatternAsHeader> </encoder> </appender> // root 태그에 추가하기 <appender-ref ref="MDC" />
로그 필터링
: error로그만 필터링 해보기.
+ apprender 추가하기<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/error.log</file> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <!-- error만 받도록 설정 --> <onMismatch>DENY</onMismatch> <!-- error이외에는 거절 --> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/archive/error.%d{yyyy-MM-dd}_%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>1KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>60</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> <outputPatternAsHeader>true</outputPatternAsHeader> </encoder> </appender> // root 태그에 추가하기 <appender-ref ref="ERROR" />
커스텀 로그
① QueryController1 작성
@Slf4j @RestController public class QueryController1 { @GetMapping("/query1") public String query() { log.trace("log --> TRACE"); log.debug("log --> DEBUG"); log.info("log --> INFO"); log.warn("log --> WARN"); log.error("log --> ERROR"); return "Query"; } }
② logback-spring-prod 수정
: logger 추가하기.<logger name="SQL_LOG1" level="INFO" additivity="false"> <appender-ref ref="QUERY"/> </logger> <logger name="SQL_LOG2" level="INFO" additivity="false"> <appender-ref ref="QUERY"/> </logger>
additivity는 상위 Logger 속성의 상속 여부를 정한다.
+ appender 추가하기<appender name="QUERY" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/query.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/archive/query.%d{yyyy-MM-dd}_%i.log</fileNamePattern> <maxFileSize>1KB</maxFileSize> <maxHistory>60</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> <outputPatternAsHeader>true</outputPatternAsHeader> </encoder>
root 태그가 아닌 logger를 추가했기 때문에 해당 controller에 topic 설정하기
@Slf4j(topic = "SQL_LOG1")
③ QueryController2 작성
: 설정해 준 SQL_LOG2를 log로 컨트롤러에서 사용하기.
이 떼 @Slf4j 어노테이션은 지워야 한다. 하나의 컨트롤러에 log를 두 개 선언 할 필요가 없기 때문이다.@RestController public class QueryController2 { public static final Logger log = LoggerFactory.getLogger("SQL_LOG2"); @GetMapping("/query2") public String query() { log.trace("log --> TRACE"); log.debug("log --> DEBUG"); log.info("log --> INFO"); log.warn("log --> WARN"); log.error("log --> ERROR"); if (true) { throw new RuntimeException(); } return "Query"; } }
출처 : 패스트캠퍼스 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) 초격차 패키지 Online
'[공부] 프로그래밍 > Spring・Spring Boot (JAVA)' 카테고리의 다른 글
API 정리 (0) 2025.04.13 Batch 정리 (0) 2025.04.12 Logback 구현 - 1 (0) 2024.05.22 Feign Client 구현 - 4 (0) 2024.05.22 Feign Client 구현 - 3 (0) 2024.05.22