팀 프로젝트 진행 중에 로깅 관련돼서 도입하려고 했습니다. 고민했던 것이 log4j와 logback이었습니다. 결정적으로 logback을 선택했던 이유는 기본적으로 스프링 부트는 SLF4 J(Simple Logging Facade for Java)를 이용하여 로그를 관리합니다.
아래는 log4j와 logback의 밴치마킹 비교글입니다.
https://www.loggly.com/blog/benchmarking-java-logging-frameworks/
gradle의 Dependencies를 확인해보면 SLF4J가 있는 것을 확인해볼 수 있습니다. SLF4J는 퍼사드 패턴을 사용합니다. 간략하게 정리하면 퍼사드 패턴은 간략화된 인터페이스를 제공하는 객체입니다. 프레임워크와의 의존성을 낮게 유지시키면서 코드를 쉽게 교체할 수 있는 장점을 가지고있습니다.
스프링 부트는 SLF4J의 퍼사드 패턴을 이용해 logback을 사용합니다.
logback 설정
프로젝트에 /resources 위치에 logback-spring.xml 파일을 생성합니다.
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
</root>
<!-- Logger -->
<logger name="com.*" level="DEBUG" appender-ref="console" />
<logger name="jdbc.sqlonly" level="INFO" appender-ref="console" />
<logger name="jdbc.resultsettable" level="INFO" appender-ref="console" />
</configuration>
위와 같은 내용으로 작성해줍니다. appender는 로깅의 양식을 설정해주는 곳입니다. 나머지 logger와 root level은 appender로 양식을 정해준 것들을 가져와 양식을 설정해줍니다.
application.properties 파일 설정을 보면
spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.hikari.jdbc-url=
spring.datasource.url=
spring.datasource.hikari.username=
spring.datasource.hikari.password=
spring.datasource.hikari.connection-test-query=SELECT SYSDATE FROM DUAL
server.port=8081
# MyBatis
# .xml 위치 지정
mybatis.mapper-locations: mybatis/**/**/*.xml
# model 프로퍼티 camel case 설정
mybatis.configuration.map-underscore-to-camel-case=true
# 패키지 명을 생략할 수 있도록 alias 설정
mybatis.type-aliases-package=
# mapper 로그레벨 설정
logging.level.com.azurealstn.codespringweb.mapper=TRACE
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
이렇게 설정해주었습니다. 프로젝트를 시작하면
위와 같이 최종적으로 logback-spring.xml에서 설정했던 양식 그대로 로깅이 되는 것을 확인할 수 있습니다. 또한, 객체와 sql의 쿼리 문과 parmeters값을 로그로 확인해볼 수 있습니다.
'혼자 공부하는 것들 > Spring' 카테고리의 다른 글
Spring 빈 스코프를 알아보자♻️ (1) | 2022.01.31 |
---|---|
@validation 이용해서 값 검증하기 + 예외처리까지!🔍 (0) | 2022.01.30 |
Bean의 생명주기 콜백 🌱 (0) | 2022.01.25 |
Bean 자동 주입 VS 수동 주입 어떤 걸 사용해야할까? 🌱 (0) | 2022.01.20 |
UnsatisfiedDependencyException 오류 해결! 😂 (3) | 2022.01.19 |
댓글