Spring
Spring - log4j 사용하기
블린더르
2019. 2. 20. 13:31
log4j 란?
프로그램이 돌아가면서 필요한 내용에 대한 로그를 남기는 기능을 제공한다.
사용법
Logger l = Logger.getLogger(클래스명.class);
l.debug("로그 메시지");
slf4j (Simple Logging Facade For Java)
slf4j : 특정 Logging 서비스 구현체에 종속되지 않도록 추상화 계층을 제공하며, 여러 종류의 로그를 연동할 수 있다.
slf4j 사용법
Logger l = LoggerFactory.getLogger(클래스명.class);
l.debug("로그 메시지");
log4j.xml 설명
Appenders
로그에 대한 환경설정이다.
layaout 태그로 로그의 출력 형식을 지정할 수 있다.
PatternLayout을 사용할 때만 param으로 패턴을 지정해줘야 한다.- 레이아웃 종류
- HTMLLayout
- SimpleLayout
- PatternLayout
- xml.XMLLayout
- 레이아웃 종류
출력 패턴
패턴 | 설명 |
---|---|
%c | 카테고리명(logger이름)을 표시한다. (카테고리명이 a.b.c일때, %c{2}는 b.c를 출력) |
%C | 클래스명을 표시한다. (풀 클래스 명이 com.log.logger일때, %C{2}는 log.logger를 출력) |
%d | 로그 시간을 출력한다. java.text.SimpleDateFormat에서 적절한 출력 포맷을 지정할 수 있다. |
%F | 파일명을 출력. 로그시 수행한 메소드, 라인번호가 함께 출력된다. |
%l | 로깅이 발생한 caller의 위치정보. 자바파일명:라인번호(링크제공) |
%L | 라인 번호만 출력한다(링크없음) |
%m | 로그로 전달된 메시지를 출력한다. |
%M | 로그를 수행한 메소드명을 출력한다. |
%n | 플랫폼 종속적인 개행문자를 출력한다. rn 또는 n |
%p | 로그 이벤트명등의 priority 가 출력(debug, info, warn, error, fatal ) |
%r | 로그 처리시간 (milliseconds) |
%t | 로그이벤트가 발생된 쓰레드의 이름을 출력한다. |
%% | % 기호를 출력한다. |
%r | 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) |
%X | 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력한다. %X{key} 형태. |
loggers
<logger name="com.kh.spring"> <level value="debug" /> </logger>
name 속성에 들어가는 패키지 이하에 있는 것들에 대한 로그를 남긴다.
level 값에 따라 출력이 달라진다.로거 레벨 : debug < info < warn < error < fatal
root
appender-ref 태그로 사용할 appender를 지정한다.
여러 개의 appender를 지정할 수 있다.- %d{HH:mm:ss, SSS}
- %d{yyyy MMM dd HH:mm:ss, SSS}
- %d{ABSOLUTE}
- %d{DATE}
- %d{ISO8601}
- %d{HH:mm:ss, SSS}
파일에 로그를 출력하기
appender 를 추가한다.
<appender name="fileLogger" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="${catalina.base}${file.separator}logs${file.separator}spring${file.separator}spring.log"/> <param name="Append" value="true"/> <param name="dataPattern" value=".yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p: [%d{MM-dd HH:mm:ss}] : [%F:%L] - %m%n" /> </layout> </appender>
root에 appender-ref 를 추가
DB 로그 출력하기
sql이나 디비에서 가져오는 데이터를 로그로 출력할 수 있다.
- pom.xml 에 Log4Jdbc-remix 넣기
<!-- https://mvnrepository.com/artifact/org.lazyluke/log4jdbc-remix -->
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
root-context 에 dataSource -> realDataSource 로 변경 한 후 sqlSessionFactoryBean 사이에 bean 추가
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource"> <constructor-arg ref="realDataSource"></constructor-arg> <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.xml 에 appender 등록
<appender name="sqlLogger" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p:%m%n"/> </layout> </appender>
logger 추가 (additivity 속성은 다른 logger에 영향을 줄 것인지에 대한 속성)
<logger name="jdbc.sqlonly" additivity="false"> <level value="info"/> <appender-ref ref="sqlLogger"/> </logger> <logger name="jdbc.resultsettable" additivity="false"> <level value="info"/> <appender-ref ref="sqlLogger"/> </logger>
이제 데이터베이스와 통신할 때 로그가 찍힌다.
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<!-- <layout class="org.apache.log4j.HTMLLayout"> -->
<!-- <layout class="org.apache.log4j.SimpleLayout"> -->
<!-- <layout class="org.apache.log4j.xml.XMLLayout">-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: [%d{MM-dd HH:mm:ss}] : [%l] - %m%n" />
</layout>
</appender>
<appender name="fileLogger" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="d:${file.separator}logs${file.separator}spring${file.separator}spring.log"/>
<param name="Append" value="true"/>
<param name="dataPattern" value=".yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: [%d{MM-dd HH:mm:ss}] : [%F:%L] - %m%n" />
</layout>
</appender>
<appender name="sqlLogger" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p:%m%n"/>
</layout>
</appender>
<!-- Application Loggers -->
<logger name="jdbc.sqlonly" additivity="false">
<level value="info"/>
<appender-ref ref="sqlLogger"/>
</logger>
<logger name="jdbc.resultsettable" additivity="false">
<level value="info"/>
<appender-ref ref="sqlLogger"/>
</logger>
<logger name="com.kh.spring">
<level value="debug" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
<appender-ref ref="fileLogger"/>
</root>
</log4j:configuration>
root-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="realDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="spring"/>
<property name="password" value="spring"/>
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="realDataSource"></constructor-arg>
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE"/>
<property name="sqlPrefix" value="[SQL]"/>
</bean>
</property>
</bean>
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactoryBean"/>
</bean>
</beans>
반응형