log4j2 설정

사내 프로젝트의 여러가지 설정, 프로퍼티들은 dev, test, master로 분리되어있는데 살펴보다보니 log4j2-test.xml이 없고 test 프로파일로 빌드 시 log4j2-dev.xml을 바라보고 있었다.

시간도 좀 여유가 있던 시점이라 그냥 내가 만들어서 분리시켰는데 하는김에 SQL 관련 로그 설정을 변경했고 공부도 할겸 내용을 정리했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!-- SQL Logger -->
<logger name="jdbc.connection" additivity="false">
<level value="OFF" />
<appender-ref ref="console"/>
</logger>

<logger name="jdbc.audit" additivity="false">
<level value="OFF"/>
<appender-ref ref="console"/>
</logger>

<logger name="jdbc.resultset" additivity="false">
<level value="OFF" />
<appender-ref ref="console"/>
</logger>

<logger name="jdbc.sqlonly" additivity="false">
<level value="OFF"/>
<appender-ref ref="console"/>
</logger>

<logger name="jdbc.resultsettable" additivity="false">
<level value="info"/>
<appender-ref ref="console"/>
</logger>

<logger name="jdbc.sqltiming" additivity="false">
<level value="info" />
<appender-ref ref="console"/>
</logger>
내용
jdbc.connection 열려있는 모든 번호와 연결 수립 및 해제 이벤트를 기록. 이는 연결 문제를 찾아내는데 매우 유용 (Connection Pool 설정)
jdbc.audit ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.
jdbc.resultset ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.
jdbc.sqlonly SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. (원래는 ? 로 표시되는데, log4j 덕분에 완전한 쿼리로 보여지는 것임)
jdbc.resultsettable SQL 결과 조회된 데이터의 table을 로그로 남긴다.
jdbc.sqltiming SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다.

SQL관련

sqlonly와 sqltiming은 sql로그를 찍는 공통적인 기능을 하며 sqltiming이 sqlonly를 포함하고 있습니다.

#{id} 등 파라미터로 넣어준 값도 모두 치환하여 출력해줍니다.

둘다 찍도록 하면 sql문이 두번 찍히니 하나만 찍어줍니다.

  • jdbc.sqlonly : SQL문을 로그로 남깁니다.
  • jdbc.sqltiming : SQL문과 수행된 시간을 로그로 남깁니다.

TABLE관련

결과를 table형식으로 만들어 출력해줍니다.

  • jdbc.resultsettable : SQL 결과 조회된 데이터를 table 형식으로 만들어줍니다.

JDBC호출 관련

아래 두개의 설정은 일반적으로는 킬 필요가 없는 설정입니다.

두개가 묶음으로 JDBC 호출정보를 출력해주는 기능을 하며 ResultSet을 포함하느냐 포함하지 않느냐의 차이입니다.

  • jdbc.audit : ResultSet을 제외한 JDBC 호출 정보를 로그로 남긴다.
  • jdbc.resultset : ResultSet을 포함한JDBC 호출 정보를 로그로 남깁니다.

additivity : 중복된 로그를 남길 지 여부를 설정한다.

기본적으로 logger는 정의한 패키지의 조상으로부터 모든 appender를 상속받아서 만약 어떤 Logger가 같은 appender를 사용한다면 메시지가 2번 찍히게 된다.

additivity=”false” 설정하면 이를 방지할 수 있다.

Log Level

로그 레벨은 다음과 같다. (OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL)

레벨 범위
OFF 이벤트를 기록하지 않음
FATAL 아주 심각한 에러가 발생한 상태를 나타냄. 시스템적으로 심각한 문제가 발생해서 어플리케이션 작동이 불가능할 경우가 해당하는데, 일반적으로는 어플리케이션에서는 사용할 일이 없음.
ERROR 요청을 처리하는중 문제가 발생한 상태를 나타냄.
WARN 처리 가능한 문제이지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄.
INFO 로그인, 상태변경과 같은 정보성 메시지를 나타냄.
DEBUG 개발시 디버그 용도로 사용한 메시지를 나타냄.
TRACE 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀더 상세한 상태를 나타냄.
ALL 모든 이벤트를 기록함
Author

Jaeyong Yoo

Posted on

2023-04-17

Updated on

2023-06-06

Licensed under

댓글