안녕하세요 dev-길길IT입니다.
보통 시스템 개발을 할 때 가장 중요한 것이 바로 적절한 디버깅과 로깅입니다. 특히 로그를 출력하는 로깅의 경우 어떤 곳에서 문제가 발생했는지를 알기 위해서 사용을 하는데요. 로그를 어떻게 출력하느냐에 따라서 개발 시간이 단축될 수도 있고, 더 보기가 편할 수도 있기 때문에 중요한 작업입니다.
그래서 오늘은 Spring에서 log4j를 적용하고 쿼리와 로그를 출력하는 방법을 알려드리겠습니다. 또한 콘솔에서 정렬해서 pretty view로 볼 수 있는 방법도 함께 알려드리겠습니다.
[Spring] log4j 적용 쿼리 및 로그 출력, 정렬하는 방법
※ 목차
1. log4j 적용
2. logger 설정
3. 쿼리 정렬하기 및 결과
1. log4j 적용
#pom.xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.2</version>
</dependency>
먼저 Spring project에 log4j를 적용하기 위해 dependency를 추가해주겠습니다. 저는 org.apache.logging.log4j 패키지를 이용했는데요. 여기에서 log4j-core, log4j-api, log4j-slf4j-impl 3가지 dependency를 maven 설정에 추가하고 install 해주었습니다.
# pom.xml
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
한가지 더 있는데요. org.lazyluke의 log4jdbc-remix입니다. 이게 있어야 로그 쿼리를 pretty view로 출력할 수 있습니다. 모든 dependency 추가가 완료되면 maven repository를 refresh해줍니다.
2. logger 설정
#web.xml
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.xml</param-value>
</context-param>
Spring project에 log4j를 적용하고 설정들을 별도로 지정해줄 수 있습니다. web.xml에 log4jConfigLocation context-param을 추가해줍니다. 경로는 log4j.xml이 있는 위치를 지정해주시면 됩니다.
# log4j.xml
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%X{uid} %d %-5p [%c]%M:%L %m%n"/>
</Console>
</Appenders/
<Logger name="jdbc.sqlonly" level="debug" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name='jdbc.resultsettable' level="debug" additivity='false'>
<appender-ref ref="console" />
</Logger>
그 후 log4j.xml에서는 여러가지 로그 출력을 위한 설정들을 진행할 수 있는데요. 각각의 의미는 다음과 같습니다.
Appenders 에서는 로그를 출력할 경로를 지정해줄 수 있습니다. 별도로 로그 파일을 만들어줄 수도 있고, DB에 쌓거나 할 수도 있는데 기본적으로는 콘솔에 출력을 합니다. patternLayout을 통해 어떻게 로그를 출력할지 패턴을 작성할 수 있습니다. 각 속성의 의미는 다음과 같습니다.
속성 | 설명 |
%p | debug, info 등 로그 레벨 이름 출력 |
%m | 로그 메시지 출력 |
%d | 로깅 이벤트 발생 시각 출력 (yyyy-MM-dd HH:mm:ss) |
%c | 로깅 메시지 앞에 전체 패키지 이름이나 전체 파일 이름 출력 |
Logger 에서는 실제로 로그 이벤트를 발생시킬 항목들을 지정할 수 있습니다. 주로 쿼리를 출력할 때는 jdbc 속성을 사용합니다. 아래와 같은 정보들이 있고, 주로 sqlonly나 resultsettable 속성을 사용합니다.
속성 | 설명 |
jdbc.connection | db와 연결되어 있는 모든 연결 정보와 이벤트 |
jdbc.audit | ResultSet을 제외한 모든 JDBC 호출 정보, 감사 로그 |
jdbc.resultset | ResultSet을 포함한 모든 JDBC 호출 정보, 감사 로그 |
jdbc.sqlonly | SQL문, 이 때 argument는 실제 data로 치환되어 출력 |
jdbc.resultsettable | SQL 결과 조회된 데이터의 table |
jdbc.sqltiming | SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보( |
또한 log4j에서 레벨에 따라 보여줄 수도 있고 보여주지 않을 수도 있습니다. 설정을 해놓으면 설정한 레벨보다 높은 단계의 로그만 보여지게 됩니다. 예를 들어 WARN으로 해놓으면 WARN, ERROR, FATAL만 보여지게 됩니다.
레벨 | 설명 |
FATAL | 시스템에 치명적인 오류가 발생 |
ERROR | 시스템 실행 중 문제가 발생 |
WARN | 시스템이 실행은 되지만 오류의 원인이 될 수 있음 |
INFO | 상태 변경, 로그인, 특정 이벤트 실행 등 운영과 관련된 정보 출력 |
DEBUG | 개발 시 디버깅 용도로 사용 |
TRACE | 상세한 로깅 출력 |
3. 쿼리 정렬하기 및 결과
# context-datasource.xml
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
p:driverClassName="${db.driver}" p:url="${db.url}" p:username="${db.username}"
p:password="${db.password}" />
<bean id="dataSourceSpied" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSource" />
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE" />
<property name="sqlPrefix" value="SQL : "/>
</bean>
</property>
</bean>
마지막으로 log4j-remix를 이용해서 쿼리를 정렬해줄 수 있습니다. spring에서 처음 db connection 정보를 작성할 때 주로 context-datasource.xml을 작성하는데요. 여기에 log4jdbcProxyDataSource bean을 새로 생성해줍니다. 위와 같이 작성해주면 되고, property name에서 loggingType:MULTI_LINE이 pretty view 역할을 합니다.
sqlPrefix의 경우 앞에 접두사로 붙을 단어를 작성해줍니다.
그리고 출력을 해보면 이렇게 쿼리가 정렬되어 나옵니다.
마무리
오늘은 Spring log4j 적용 쿼리 및 로그 출력, 정렬하는 방법을 알아보았습니다. 모든 개발의 기본이 되는 로그 출력은 처음한 번 셋팅만 해두면 추후에 개발에 많은 도움이 됩니다. log4j는 그런면에서 정말 강력한 기능들을 제공해주고 있으니 한 번씩 참고해보시기 바랍니다.
오늘도 읽어주셔서 감사합니다.
'Dev > Java' 카테고리의 다른 글
[Spring] interceptor를 이용한 mapping 요청 로그 출력 (0) | 2024.08.02 |
---|---|
[Spring Boot] Thymeleaf 뷰 레이아웃 설정 및 사용하는 방법 (0) | 2024.07.26 |
[Spring] Tiles 적용하는 법과 사용하는 방법 (10) | 2024.07.24 |
IntelliJ, Maven, createprocess error=206 파일 이름이나 확장명이 너무 깁니다. 오류 해결 방법 (0) | 2023.03.23 |
[Spring Project 셋팅] 2. Spring Project의 구조와 흐름 (1) | 2022.09.01 |
댓글