본문 바로가기
Dev/Java

[Spring] log4j 적용 쿼리 및 로그 출력, 정렬하는 방법

by 데브길길잇 2024. 7. 31.
728x90
반응형

안녕하세요 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는 그런면에서 정말 강력한 기능들을 제공해주고 있으니 한 번씩 참고해보시기 바랍니다.

 

오늘도 읽어주셔서 감사합니다.

 

 

728x90
반응형

댓글