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
끝.
'공부 > 프로그래밍' 카테고리의 다른 글
[log4j] runtime 중 레벨 변경(@Slf4j 같이 적용) (0) | 2021.12.20 |
---|---|
[linux] ec2(aws) 에서 jenkins 설치 중 demonize 에러가 발생할경우 (0) | 2021.12.13 |
[JPA] 쿼리 로깅에 p6spy multi line 적용하기 (0) | 2021.11.05 |
[gradle] 멀티모듈에서 spring 프로젝트 -> spring 프로젝트 의존성 연결하기 (0) | 2021.10.27 |
[gradle] intellij 에서 gradle을 이용해 runnable jar 만들기 (1) | 2021.10.22 |
댓글