그라가승훈
[SpringBoot] -Logback 사용하기 - (Slf4j, log4jdbc, p6spy) 본문
- Logback 이란?
가장 많이 사용되던 라이브러리 Log4j 가 개발 종료되고 그것을 토대로 만든게 Logback이다.
1. 장점!
Logback의 공식 홈페이지에 나와 있는 내용 중 중요한 장점 몇 가지이다.
- Log4j와 비교해서 성능은 약 10배 빠르고 메모리 사용량도 적다.
- Log4j부터 진행한 테스트 경험을 토대로 광범위한 테스트를 통해 검증되었다.
- 로그 설정이 변경될 경우 서버를 재시작하지 않고 바로 반영된다.
- Logback은 로깅 구현체 중 하나로 slf4j(Simple Logging Facade for java)를 함께 사용한다.
- slf4j의 API 를 이용할 경우 로깅 구현체의 종류와 상관없이 일관된 로그 코드를 작성할 수 있다.
- Logback 설정
1. logback-spring.xml
src/main/recources 에 logback-spring.xml 생성 후 설정.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>
<!-- 로거 -->
<logger name="com.example" level="DEBUG" appender-ref="console" />
<!-- 루트 로거 -->
<root level="off">
<appender-ref ref="console" />
</root>
</configuration>
- appender : 로그를 어디에 출력할지 (콘솔, 파일기록, DB저장 등) 결정
- encoder : 출력할 로그를 지정한 형식을 변환하는 역할
- logger : 로그 Level 설정
- trace, debug info, warn, error 순이다.
2. Logback 사용
로거로 Logback을 사용하더라도 코드 내에서는 slf4j의 의존성만 사용한다.
// @Slf4j 사용하면 로거 생성 필요없음.
private Logger log = LoggerFactory.getLogger(this.getClass());
위 코드처럼 클래스 객체를 넘겨주면 패키지 이름 + 클래스 이름으로 로거의 이름(getLogger())이 구성된다.
- Log4JDBC 로 쿼리 로그 정렬하기
1. build.gradle 에 라이브러리 추가
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
2. log4jdbc.log4j2.properties 설정
src/main/resources 에 생성
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength = 0
책에 나온 내용은 위 두 설정인데,
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
이미 driver-class-name를 com.mysql.cj.jdbc.Driver 로 설정해줬는데도 나와서.. 밑에 설정을 추가해줬다.
log4jdbc.auto.load.popular.drivers=false
3. application.properties 설정
driver-class-name과 URL을 변경해준다.
- 변경 전
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8
- 변경 후
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8
4. logback-spring.xml 설정 추가
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>
<!-- 로거 -->
<logger name="com.example" level="DEBUG" appender-ref="console" />
<logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog" />
<logger name="jdbc.resultsettable" level="INFO" appender-ref="console-infolog" />
<!-- 루트 로거 -->
<root level="off">
<appender-ref ref="console" />
</root>
</configuration>
- jdbc.sqlonly : 관련된 파라미터는 자동으로 변경되어 SQL을 보여줌.
- jdbc.sqltiming : SQL문과 해당 실행시간을 밀리초 단위로 보여줌.
- jdbc.audit : ResultSets를 제외한 모든 jdbc 호출정보를 보여줌. 매우 많은 로그가 발생하기 때문에 추적하기 위한것이 아니라면 사용하지 않음.
- jdbc.resultset : ResultSets를 포함한 모든 jdbc 호출정보를 보여줌. jdbc.audit 보다 더 많은 로그 생성.
- jdbc.resulttable : SQL의 조회 결과를 테이블로 보여줌.
- jdbc.connection : connection의 연결과 종료에 관한 로그를 보여줌.
- p6spy 라이브러리 사용
현재 다니는 회사의 프로젝트 로그설정을 확인해보니 공부한 것과 같지 않고, p6spy 라이브러리를 사용하고 있었다.
jpa는 hibernate로, mybatis 는 위와같이 로그 포맷팅을 해줄텐데 jpa와 mybatis 를 같이 사용하는 우리 회사같은 경우에는 p6spy 라이브러리만 사용하면 프록시로 래핑해서 로그를 알아서 보여주는 것 같다.
아래 블로그에 자세히 설명 되어있다.
https://shanepark.tistory.com/415
[Spring Boot JPA] P6Spy 활용해 쿼리 로그 확인하기
Intro 스프링부트와 JPA로 프로젝트를 진행하다 보면 실제 쿼리가 어떻게 나갈지 눈으로 확인을 하고 싶을 때가 참 많습니다. JPA가 참 편하긴 한데 개발자가 직접 쿼리를 작성하지 않았다 보니 실
shanepark.tistory.com
1. 앞서 설정한 로그 설정들을 제거.
- logback-spring.xml
- log4jdbc.log4j2.properties
- build.gradle에 log4jdbc 의존성
2. p6spy 라이브러리 의존성 추가
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.1'
3. application.properties 에 로깅 설정
로깅 패턴과 패키지의 로그 레벨 설정.
logging.pattern.console= %d{yy-MM-dd HH:mm:ss.SSS} %yellow([%t]) %highlight(%-5level) %-40.40logger{36}.%M\\(%line\\): %msg%n
logging.level.com.example= debug
- 로그
1. log4jdbc 및 slf4j 설정으로 나온 로그
2. p6spy 로그
'Spring' 카테고리의 다른 글
[SpringBoot] - AOP (2) | 2023.10.15 |
---|---|
[SpringBoot] - 인터셉터(Interceptor) (0) | 2023.10.15 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 13. 전형적인 방식의 로그인 방법 (0) | 2022.08.21 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 12. DB 격리 수준 (0) | 2022.08.21 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 11. 회원가입 하기 (Ajax 요청) (0) | 2022.08.21 |