본문 바로가기

전자정부표준프레임워크(eGovFrame)

[eGovFrame] log4j, log4jdbc-log4j2 설정

개발환경: 전자정부표준프레임워크(eGovFrame) 3.10.0

 

 

1. log4j란? 

Log4j는 자바기반의 로깅 유틸리티로 Apache에서 만든 오픈소스 라이브러리라고 한다. Log4j는 옵션 설정을 통해서 선택적으로 로그를 남기거나 특정 파일에 로그를 생성하는 등 다양한 이점을 가지고 있다.

 

log4j 레벨

로그 레벨 설명 
FATAL  아주 심각한 에러가 발생한 상태.
ERROR  어떠한 요청을 처리하는 중 문제가 발생한 상태.
 WARN  프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는
 경고성 메시지.
 INFO  어떠한 상태변경과 같은 정보성 메시지.
 DEBUG  개발시 디버그 용도로 사용하는 메시지.
 TRACE  디버그 레벨이 너무 광범위한것을 해결하기 위해서 좀 더 상세한 이벤트를 나타냄.

설정 레벨 이상의 로그가 출력된다. INFO로 설정했다면 INFO이상의 레벨인 INFO, WARN, ERROR, FATAL 로그만 출력된다.

 

log4j 구성요소

 요소  설명
Logger  출력할 메시지를 Appender에 전달.
Appender  전달된 로그를 어디에 출력할 지 결정. (콘솔 출력, 파일 기록, DB 저장 등)
Layout  로그를 어떤 형식으로 출력할 지 결정.

 

Logger

 요소 설명 
 jdbc.sqlonly  SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.
 jdbc.sqltiming  SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다.
 jdbc.audit  ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.
 jdbc.resultset  ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.

 

Appender

요소  설명 
 ConsoleAppender  org.apache.log4j.ConsoleAppender
 콘솔에 로그 메시지를 출력한다.
 FilerAppender  org.apache.log4j.FilerAppender
 로그 메시지를 지정된 파일에 기록한다.
 RollingFileAppender  org.apache.log4j.RollingFileAppender
 파일 크기가 일정 수준 이상이 되면 기존 파일을 백업파일로 두고 처음부터 다시 기록한다.
 DailyRollingFilerAppender  org.apache.log4j.Daily.Rolling.File.Appender
 일정 기간 단위로 로그 파일을 생성하고 기록한다.

 

LayOut

 패턴 설명 
%m   로그 내용 출력
%p  debug, info, warn, error 등의 priority 출력
%r  어플리케이션 시작 후 이벤트가 발생하는 시점까지의 경과시간. (밀리세컨드로 출력)
%c  package 출력
%C  클래스명 출력
%d  이벤트 발생 날짜 출력
%n  개행문자(\n) 출력
%M  로깅이 발생한 method 이름 출력
%F  로깅이 발생한 프로그램 파일명 출력
%l  로깅이 발생한 caller 정보 출력
%L  로깅이 발생한 caller 라인수 출력
%x  로깅이 발생한 thread와 관련된 NDC 출력
%X  로깅이 발생한 thread와 관련된 MDC 출력
%  % 출력 표시
%t  쓰레드 이름 출력

 

2. log4j 설정

1. pom.xml에 두개의 dependency를 추가한다.

<dependency>
	<groupId>org.codehaus.jackson</groupId>
	<artifactId>jackson-core-asl</artifactId>
	<version>1.9.13</version>
</dependency>
		
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.18.0</version>
</dependency>

 

2. src/main/resources 아래에 log4j2.xml 파일을 만들고 아래 내용을 입력한다.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="logNm">Spring Log4j2</Property>
        <Property name="layoutPattern">%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p}\(${PID:- }\)[%t] [%logger{30}:%line] %msg%n</Property>
    </Properties>
    <Appenders>
        <Console name="Console_Appender" target="SYSTEM_OUT">
            <PatternLayout pattern="${layoutPattern}"/>
        </Console>
        <RollingFile name="File_Appender" fileName="logs/${logNm}.log" filePattern="logs/${logNm}_%d{yyyy-MM-dd}_%i.log.gz">
            <PatternLayout pattern="${layoutPattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="1000KB"/>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="10" fileIndex="min"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO" additivity="false">
            <AppenderRef ref="Console_Appender"/>
            <AppenderRef ref="File_Appender"/>
        </Root>
        <Logger name="org.springframework" level="INFO"
                additivity="false">
            <AppenderRef ref="Console_Appender" />
            <AppenderRef ref="File_Appender"/>
        </Logger>
        <!--하단 name에 본인이 사용하는 package명으로 수정할 것-->
        <Logger name="com.basic.eGovFrame" level="INFO" additivity="false">
            <AppenderRef ref="Console_Appender" />
            <AppenderRef ref="File_Appender"/>
        </Logger>
        <Logger name="org.springframework" level="INFO" additivity="false">
            <AppenderRef ref="Console_Appender" />
        </Logger>
    </Loggers>
</Configuration>

 

3. log4jdbc-log4j2란?

 Log4jdbc는 스프링에서 SQL문을 실행한 로그를 효과적이고 직관적으로 볼 수 있도록 해주는 라이브러리이다.

log4jdbc를 사용하면 쿼리 로그가 아래와 같이 보이게 된다.

가독성 좋은 표 형식으로 보이게 된다.

 

4. log4jdbc-log4j2 설정

1. pom.xml에 아래 dependency를 추가한다.

        <dependency>
		    <groupId>org.bgee.log4jdbc-log4j2</groupId>
		    <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
		    <version>1.16</version>
		</dependency>

 

2. resources 폴더 밑에 log4jdbc.log4j2.properties 파일 생성 후 아래 내용을 입력한다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.drivers=org.mariadb.jdbc.Driver

 

3. resources 폴더 밑에 db.properties 파일 생성 후 아래 내용을 입력한다.

예시

#local
url=jdbc:log4jdbc:mariadb://localhost:3306/egovframe?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
username=kje
password=qwer1234

 

4. context-datasource.xml에 아래 내용을 입력한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
        
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>classpath:db.properties</value>
		</property>
	</bean>
	
  	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
		<property name="url" value="${url}" />
		<property name="username" value="${username}" />
		<property name="password" value="${password}" />
	</bean>
    
</beans>

 

5. 프로젝트 우클릭 > maven > update project 해준다.

 

결과

 

※ 본문의 예제 소스

basic_eGovFrame.zip
0.03MB