on
[log4j] 로그레벨 package 별로 설정하기
[log4j] 로그레벨 package 별로 설정하기
JDBC 라든가 특별 패키지에만 로그레벨을 설정하고 싶은데 어떻게 해야할지 설정하는 것이다.
우선 log4j를 설정하려면 특별한 경로설정하지 않는 한 다음 위치에 두면된다.
resources/log4j.properties
다음처럼 설정을 추가하자
log4j.rootLogger=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%t] [%-5p] %c - %m%n
기본값으로 debug 레벨을 주었다. 그리고 실행을 할 경우 debug로 수많은 로그가 찍힌다.
[2021-12-02 18:54:43] [main] [DEBUG] com.test.app.config.manager.ProfileConfigManager - LDAPConfig.setConfigFromFile() [2021-12-02 18:54:43] [main] [INFO ] com.test.app.threads.ProfileServerManagerThreads - disable profile server use [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] org.springframework.jdbc.core.JdbcTemplate - Executing SQL query [select 1 from dual] [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - HikariPool-1 - configuration: [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - allowPoolSuspension................................false [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - autoCommit................................true [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - catalog................................none [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - connectionInitSql................................none [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - connectionTestQuery................................none [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - connectionTimeout................................4000 [2021-12-02 18:54:43] [pool-1-thread-1] [DEBUG] com.zaxxer.hikari.HikariConfig - dataSource................................none ... [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.audit - 2. Connection.isReadOnly() returned false com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:408) [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.audit - 2. Connection.getAutoCommit() returned true com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:412) [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.audit - 2. Connection.isValid(1) returned true com.zaxxer.hikari.pool.PoolBase.checkValidationSupport(PoolBase.java:464) [2021-12-02 18:54:44] [HikariPool-1 housekeeper] [DEBUG] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Pool stats (total=1, active=0, idle=1, waiting=0) [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.audit - 2. Connection.getTransactionIsolation() returned 2 com.zaxxer.hikari.pool.PoolBase.checkDefaultIsolation(PoolBase.java:485) [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] com.zaxxer.hikari.pool.HikariPool - HikariPool-2 - Added connection net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@1730f8a4 [2021-12-02 18:54:44] [pool-2-thread-1] [INFO ] com.zaxxer.hikari.HikariDataSource - HikariPool-2 - Start completed. [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.audit - 2. Statement.new Statement returned com.zaxxer.hikari.pool.ProxyConnection.createStatement(ProxyConnection.java:294) [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.audit - 2. Connection.createStatement() returned net.sf.log4jdbc.sql.jdbcapi.StatementSpy@1fcda803 com.zaxxer.hikari.pool.ProxyConnection ... [2021-12-02 18:54:44] [HikariPool-1 housekeeper] [DEBUG] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Pool stats (total=1, active=0, idle=1, waiting=0) [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] com.zaxxer.hikari.pool.HikariPool - HikariPool-2 - Added connection net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@34d3b772 [2021-12-02 18:54:44] [pool-2-thread-1] [INFO ] com.zaxxer.hikari.HikariDataSource - HikariPool-2 - Start completed. [2021-12-02 18:54:44] [pool-2-thread-1] [DEBUG] jdbc.sqlonly - com.zaxxer.hikari.pool.ProxyStatement.executeQuery(ProxyStatement.java:110) 2. select 1 from dual ... [2021-12-02 18:54:44] [pool-3-thread-1] [DEBUG] jdbc.resultset - 1. ResultSet.next() returned true com.zaxxer.hikari.pool.HikariProxyResultSet.next(HikariProxyResultSet.java:-1) [2021-12-02 18:54:44] [pool-3-thread-1] [DEBUG] jdbc.resultset - 1. ResultSet.getMetaData() returned indep.jdbc.core.JdbcResultSetMetaData@73876f94 com.zaxxer.hikari.pool.HikariProxyResultSet.getMetaData(HikariProxyResultSet.java:-1) [2021-12-02 18:54:44] [pool-3-thread-1] [DEBUG] jdbc.resultset - 1. ResultSet.getInt(1) returned 1 com.zaxxer.hikari.pool.HikariProxyResultSet.getInt(HikariProxyResultSet.java:-1) [2021-12-02 18:54:44] [pool-3-thread-1] [DEBUG] jdbc.resultset - 1. ResultSet.wasNull() returned false com.zaxxer.hikari.pool.HikariProxyResultSet.wasNull(HikariProxyResultSet.java:-1)
com.test.app.* 라고 써있는 로그는 현재 실행되고 있는 프로젝트의 패키지 경로이다.
그리고 jdbc 를 연결했기 때문에 org.springframework.jdbc 가, 그리고 hikari 경로도 보인다. 그 앞에 로그레벨로 [DEBUG]가 찍혀있다.
jdbc 로그중 audit 을 off 레벨로 변경하여 실행해보면 audit이 출력되지 않는걸 확인할 수 있다
resources/log4j.properties에서 아래 내용을 추가한다
... log4j.logger.jdbc.audit=OFF
log4j.logger 까지는 prefix와 같으니 항상 붙어야 하는 것이고 jdbc.audit 은 jdbc의 경로이다.
이제 실행해보면 audit 로그가 보이지 않는 것을 확인할 수 있다.
# 패키지별 로그레벨 설정하기
그럼 로그 레벨별 출력을 확인해보자. 다음 클래스를 생성해보자
여기서는 Lombok 의 @Slf4j 를 이용해 로그를 테스트한다.
import lombok.extern.slf4j.Slf4j; @Slf4j public class TestLog { public TestLog() { } public void test() { log.trace("=============== trace"); log.debug("=============== debug"); log.info("=============== info"); log.warn("=============== warn"); log.error("=============== error"); } }
test()를 실행해보면 다음과 같은 로그가 나온다.
[2021-12-02 19:04:41] [main] [DEBUG] com.test.app.config.TestLog - =============== debug [2021-12-02 19:04:41] [main] [INFO ] com.test.app.config.TestLog - =============== info [2021-12-02 19:04:41] [main] [WARN ] com.test.app.config.TestLog - =============== warn [2021-12-02 19:04:41] [main] [ERROR] com.test.app.config.TestLog - =============== error
처음 설정한 레벨이 debug 이기 때문에 다음설정을 하면 debug이상의 레벨만 보인다.
그럼 패키지별로 로그는 어떻게 설정할 수 있을까?
위 파일의 경로는 com.test.app.config.TestLog 클래스다. com.test.app.config 의 경로를 WARN으로 수정해보자
... log4j.logger.com.test.app.config=WARN
이제 실행하면 WARN 이상의 경로만 보여준다
[2021-12-02 19:08:56] [main] [WARN ] com.test.app.config.TestLog - =============== warn [2021-12-02 19:08:56] [main] [ERROR] com.test.app.config.TestLog - =============== error
잘 작동한다.
# 런타임 중 레벨 변경
마지막으로 런타임 도중에 레벨을 변경하고 싶으면 어떻게하면될까?
그떄는 클래스 내에 다음의 설정을 해줘야한다.
import org.apache.log4j.LogManager; ... public void setLogLevel() { LogManager.getRootLogger().setLevel(Level.INFO); } ...
rootLogger 에서 setLevel을 이용해 로그레벨을 설정하면 Runtime에서도 변경이 가능하다.
만약 클래스별로 하고싶다면 LogManage 를 이용해 다음처럼 설정하면 된다.
... public void setLogLevelThisClass() { LogManager.getRootLogger().setLevel(Level.DEBUG); LogManager.getLogger(this.getClass()).setLevel(Level.WARN); log.trace("=============== trace"); log.debug("=============== debug"); log.info("=============== info"); log.warn("=============== warn"); log.error("=============== error"); } ...
ROOT레벨이 DEBUG 여도 해당 클래스의 레벨이 WARN 이기 때문에 WARN 이상의 레벨만 보인다
[2021-12-02 19:15:20] [main] [WARN ] com.test.app.config.TestLog - =============== warn [2021-12-02 19:15:20] [main] [ERROR] com.test.app.config.TestLog - =============== error
끝.
from http://lemontia.tistory.com/1059 by ccl(A) rewrite - 2021-12-03 09:27:37