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}

파일에 로그를 출력하기

  1. 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>
  2. root에 appender-ref 를 추가

DB 로그 출력하기

sql이나 디비에서 가져오는 데이터를 로그로 출력할 수 있다.

  1. 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>
  1. 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>
  2. 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>
  3. 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>
반응형