Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

그라가승훈

[SpringBoot] -Logback 사용하기 - (Slf4j, log4jdbc, p6spy) 본문

Spring

[SpringBoot] -Logback 사용하기 - (Slf4j, log4jdbc, p6spy)

그라가승훈 2023. 10. 13. 22:56

- 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 로그

 

Comments