앞선 포스팅에서 @Mapper 어노테이션을 사용하여 xml에 등록된 SQL을 실행되도록 하였다.
[Spring & Spring Boot/DB 설정] - [Spring Boot] MySQL - Mybatis JAVA config
log4jdbc개념은 아래 포스팅을 참고하기 바란다.
그럼 이제 console에 내가 실행한 SQL이 보이도록 설정해보겠다.
application.properties(yml)에서 간단하게 logging 설정을 할 수 있지만 상세한 설정을 위해서는 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 -->
<logger name="com.cm.lcm2" level="DEBUG" appender-ref="console" />
<logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog" />
<!-- Root Logger -->
<root level="off">
<appender-ref ref="console" />
</root>
</configuration>
태그 | 설명 |
appender | 전달받은 로그를 어디에, 어떻게 출력할지 결정 ConsoleAppender - 콘솔에 로그 메시지 출력 FileAppender - 파일에 로그 메시지 출력 RollingFileAppender : 여러개의 파일을 롤링, 순회하면서 로그 출력 |
encoder | appender에 포함되어 출력할 로그의 형식을 지정 |
logger | 로그를 출력하는 요소 level 속성을 통해 출력할 로그 레벨을 조절하여 appender에 전달 |
Profile
로그 생성시 로컬,개발,운영 환경마다 다른 속성을 설정해야 할 필요 있음.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProfile name="local">
<logger name="com.dev" level="info" additivity="false">
...
</logger>
</springProfile>
<springProfile name="dev">
<logger name="com.dev" level="info" additivity="false">
...
</logger>
</springProfile>
<springProfile name="prod">
<logger name="com.dev" level="error" additivity="false">
...
</logger>
</springProfile>
...
</configuration>
로그레벨
레벨 | 설명 |
FATAL | 아주 심각한 에러가 발생한 상태 |
ERROR | 요청을 처리하던 중 문제가 발생한 상태 |
WARN | 프로그램 실행에는 문제가 없지만, 에러의 원인이 될 수 있는 경고성 메시지 |
INFO | 상태 변경과 같은 정보성 메시지 |
DEBUG | 개발시에 디버그 용도로 사용하는 메시지 |
TRACE | DEBUG레벨보다 더 상세한 이벤트 |
로그타입
타입 | 설명 |
sqlonly | SQL을 로그에 남기며 Prepared Statement와 관련된 파라미터는 자동으로 변경되어 SQL을 출력한다 |
sqltiming | SQL과 SQL실행시간(miliseconds 단위)을 출력한다 |
audit | ResultSet을 제외한 모든 JDBC 호출 정보를 출력 |
resultset | ResultSet을 포함한 모든 JDBC 호출 정보를 출력 |
resultsettable | SQL 조회 결과를 테이블 형태로 출력 |
connection | Connection의 연결과 종료에 관련된 로그를 출력 |
패턴
패턴 | 설명 |
%d | 로그 기록시간 |
%p | 로깅 레벨 |
%F | 로깅이 발생한 프로그램 파일명 |
%M | 로깅이 발생한 메소드의 이름 |
%t | 쓰레드 명 |
%c | 로깅이 발생한 카테고리 |
%C | 로깅이 발생한 클래스명 |
%m | 로그 메시지 |
%n | New Line |
Console
xml에 작성한 SQL이 console에 출력되는 것을 확인했다. 그러면 이제 다음과 같은 의문이 생길 것이다.
내가 작성한 SQL은 좀 더 이쁘게 작성되어있는데 왜 이렇게 출력되지??
이제 log4jdbc를 이용하여 SQL을 가독성있게 표현해보자.
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
spring:
datasource:
hikari:
#driver-class-name: com.mysql.cj.jdbc.Driver #log4jdbc 적용전
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy #log4jdbc 적용후
username: {id}
password: {password}
#jdbc-url: jdbc:mysql://{url}:{port}/{db스키마} #log4jdbc 적용전
jdbc-url: jdbc:log4jdbc:mysql://{url}:{port}/{db스키마} #log4jdbc 적용후
minimum-idle: 5
maximum-pool-size:
idle-timeout: 30000
pool-name: DevLogHikariCP
max-lifetime: 200000
connection-timeout: 30000
connection-test-query: /*CONNECTION TEST QUERY*/SELECT NOW() FROM DUAL
driver-class-name / jdbc-url을 변경해준다.
# log4jdbc spy의 로그 이벤트를 slf4j를 통해 처리한다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
# 로그를 표시할 줄의 제한, 0은 무제한
log4jdbc.dump.sql.maxlinelength=0
# log4jdbc의 드라이브 클래스 설정
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
log4jdbc.auto.load.popular.drivers=false
properties파일의 한글이 깨진다명 encoding을 수정해주어야한다.
설정 방법은 다음 포스팅을 확인하기 바란다.
[IDE/설정] - [Eclipse, STS] properties 한글 깨짐
console
필자는 로그를 어떻게 설정하느냐도 개발 못지않게 중요하다 생각한다. 특히 유지보수를 진행할때 로그를 보고 추적을 해야하는데 어디서 어떤 이슈가 있는지 확인하기 어렵다면 그만큼 대처가 늦어진다.
다음 포스팅에는 URL로 호출시 Controller에서 인터셉터하여 전처리, 후처리에 로그를 찍는 방법과 logback을 이용하여 파일로 적재하는 방법에 대해 정리해보겠다.
- URL Controller 호출시 인터셉터하여 로그적재 -
[Spring & Spring Boot/설정] - Spring 인터셉터
- logback을 이용하여 로그파일 적재 -
Mybatis Plugin - Interceptor (0) | 2022.10.24 |
---|---|
SpringBoot logback 파일적재 (2) | 2021.10.27 |
Spring JPA란 (1) | 2021.10.17 |
Spring AOP Transaction설정 (0) | 2021.10.16 |
[DBCP] HikariCP (8) | 2021.10.12 |
댓글 영역