기존 쿼리 로그에 대한 문제점💢
기존 로그에서 쿼리에 대한 로그 표시가 굉장히 가독성이 떨어진다는 것을 알 수 있다.
아래는 내가 이전 게시물에서 이어서 LogBack만 설정하고 표시한 로그 중 일부이다
2022-11-03 14:05:44,719 DEBUG [com.example.boardPractice.board.mapper.BoardMapper.checkLogin] ==> Preparing: SELECT user_id, user_pw, user_nickname FROM member_table WHERE user_id = ? AND user_pw = ?
2022-11-03 14:05:44,720 DEBUG [com.example.boardPractice.board.mapper.BoardMapper.checkLogin] ==> Parameters: id_test(String), pw_test(String)
2022-11-03 14:05:44,721 DEBUG [com.example.boardPractice.board.mapper.BoardMapper.checkLogin] <== Total: 0
- 쿼리문이 정렬되지 않아 보기 힘듬
- 파라미터나 결과에 대한 표시가 빈약함
- 주어진 파라미터가 ?로 표시됨
이런 문제를 해결하기 위해 Log4JDBC 라이브러리를 사용한다.
하지만 다음과 같은 단점도 있다.
log4jdbc를 이용하는 경우 속도가 기존보다 저하될수 있고, 데이터베이스에 따라서 지원되지 않는 경우도 있으므로 설정 후에 정상적 동작을 반드시 확인해야 한다.
Log4JDBC 라이브러리 추가하기➕
build.gradle 파일에 있는 dependencies { } 안에 다음 문구 추가
implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'
- 옛날 버전의 compile이 deprecate 되면서 implementation으로 대체되었다.(6.x 버전 부터)
- 예전에 사용되던 log4jdbc-remix라는 라이브러리는 개발이 종료되었다.
- 따라서 여기서는 log4jdbc-log4j2을 사용한다
Log4JDBC 설정 💬
1.log4jdbc.log4j2.properties 설정
src/main/resources 폴더 밑에 log4jdbc.log4j2.properties 파일을 만들다.
아래의 설정을 추가한다.
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
추가로 다음의 설정도 할 수 있다. (이외에도 많다.)
<예시>
log4jdbc.dump.sql.maxlinelength = 0
쿼리문을 최대 몇 줄까지 출력할 것인지 설정,
0이면 제한 없음
log4jdbc.auto.load.popular.drivers = false
가끔 프로젝트 실행시 아래와 같이 붉은 글씨로 에러가 날 때가 있다.
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.
이때 이 설정을 추가해주면 에러 메시지가 사라진다.
2. application.properties 설정
여기서는 기존에 datasource드라이버와 jdbc url을 바꿔야하는데,
hikari Cp를 이용하고 있는 나의 환경에서의 변경을 나타내고 있다. 참고해서 자신의 설정에 적용해 보시길
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/personal_test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/personal_test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
hikari Cp나 커넥션 풀에 대해 헷갈리면 아래 링크를 참조하길 바란다. 굉장히 잘 설명되어있다.
3.logback-spring.xml 설정
이 글에서는 logback을 기준으로 설명하고 있으며, 이에 관련된 부분은 나의 이전 logback에 관련된 글을 살펴보길 바란다.
logback-spring.xml 의 logger에 다음을 추가한다.
<logger name="jdbc.sqlonly" level="INFO" appender-ref="[적용할 appender]"/>
<logger name="jdbc.resultsettable" level="INFO" appender-ref="[적용할 appender]"/>
이렇게 되면 로그에 다음과 같은 로그가 추가된다.
2022-11-03 15:25:21,375 INFO [jdbc.sqlonly] SELECT
board_idx,
title,
hit_cnt,
created_datetime
FROM
t_board
WHERE
deleted_yn= 'N'
ORDER BY board_idx DESC
2022-11-03 15:25:21,399 INFO [jdbc.resultsettable]
|----------|----------------|--------|-----------------|
|board_idx |title |hit_cnt |created_datetime |
|----------|----------------|--------|-----------------|
|8 |글 제목 |0 |[unread] |
|7 |글 제목 |0 |[unread] |
|6 |fadsfdasasdggds |0 |[unread] |
|5 |fads |0 |[unread] |
|4 |fdsa |0 |[unread] |
|2 |안녕하세요 |10 |[unread] |
|----------|----------------|--------|-----------------|
2022-11-03 15:25:21,399 DEBUG [com.example.boardPractice.board.mapper.BoardMapper.selectBoardList] <== Total: 6
매우 깔끔해졌다. (unread는 왜그런지 모르겠다. 근데 값 읽어오는데는 문제가 없었다. 웹도 잘 열어짐. dto에도 값 다 있음)
추가로 생성할 수 있는 로거(logger name="")
로거 | 설명 |
jdbc.sqlonly | SQL문을 보여준다. Prepared statement의 경우 관련된 파라미터로 자동 변경해줌 |
jdbc.sqltiming | SQL문과 함께 실행시간을 밀리초 단위로 보여줌 |
jdbc.audit | ResultSets를 제외한 모든 JDBC호출 정보를 보여줌 매우 많은 로그가 발생해서 JDBC 관련 문제 해결이 아니면 일반적으로 사용하지는 않음 |
jdbc.resultset | ResultSets를 포함한 모든 JDBC호출 정보를 보여줌 더 많은 로그가 나옴 |
jdbc.resultsettable | SQL의 조회 결과를 테이블로 보여줌 |
jdbc.connection | Connection의 연결과 종료에 관련된 로그를 보여줌. Connection 누수 문제를 해결하는데 도움이 됨 |
'SpringBoot > 로그' 카테고리의 다른 글
[LogBack] LogBack이란? 개요, 사용방법, 설명 (0) | 2022.11.02 |
---|