ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - log4j 사용하기
    Spring 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>
    
    반응형

    'Spring' 카테고리의 다른 글

    Spring - 파일 다운로드 하기  (0) 2019.02.25
    Spring - 파일 업로드 하기  (0) 2019.02.23
    Spring - MyBatis 설정하기  (0) 2019.02.20
    Spring - 설정하기  (0) 2019.02.20
    Spring - 개발 환경 구성하기(STS, Maven)  (0) 2019.02.18

    댓글

Designed by Tistory.