본문 바로가기
공부/프로그래밍

[log4j] 로그레벨 package 별로 설정하기

by demonic_ 2021. 12. 3.
반응형

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

 

 

 

끝.

반응형

댓글