Logback 구성 파일을 사용하면 코드를 다시 컴파일 할 필요없이 logging 동작을 재정의 할 수도 있다.

구성 파일에 로그를 어떤 형태로 어디에 남길 것인지에 대한 계획도 명시할 수 있으며, 프로그래밍 방식이나 XML, Groovy 형식으로도 작성할 수 있다.

Logback 웹사이트에서 기존 log4j 사용자를 위한 PropertiesTranslator 도 제공한다. (log4j.properties -> logback.xml)



Logback 의 구성 파일 검색 순서


  1. classpath 에서 logback-test.xml 파일 검색.
  2. 없으면 logback.groovy 파일 검색.
  3. 없으면 logback.xml 파일 검색.
  4. 없으면 BasicConfigurator 를 사용하여 logback 을 가장 기본적으로 구성하고, console 로 logging 출력.


src/main/resources 디렉토리에 logback.xml, src/test/resources 디렉토리에 logback-test.xml 파일을 두어 운영/개발에 대한 구성을 분리하여 사용할 수 있다.

구성 파일이 없어서 BasicConfigurator 를 사용하게 되면, root logger 는 DEBUG 레벨이 할당되고 아래의 형식을 가진다.


%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n


// console :

16:06:09.031 [main] INFO  chapters.configuration.MyApp1 - Entering application.

16:06:09.046 [main] DEBUG chapters.configuration.Foo - Did it again!

16:06:09.046 [main] INFO  chapters.configuration.MyApp1 - Exiting application.



logback.xml 구성


아래 코드는 BasicConfigurator 로 기본 설정된 것을 logback-test.xml 이나 logback.xml 파일로 자체 구성한 것이다.


<configuration>
 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
 
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
cs


이것이 구성 파일을 찾지 못했을 때 적용되는 기본 구성이다.

위 기본 파일 처럼, 구성 파일의 기본적인 구조는 <configuration> 안에 <appender>, <logger>, <root> 순으로 나열하는 것이다.


<appender> 는 name, class 속성을 필수로 지정해야 하며, 선택적으로 하나 이상의 <layout>, <encoder>, <filter> 를 포함할 수 있다.

logback 0.9.19 부터 FileAppender와 하위 클래스는 <encoder> 를 필요로 하고 더 이상 <layout> 을 사용하지 않는다.

<encoder> 는 class 속성을 지정하지 않으면 PatternLayoutEncoder 클래스가 적용된다.

<logger> 는 root 로거와 레벨이나 appender 가 다를 경우 패키지명과 함께 설정한다.

<root> 는 appender 를 참조하여 root 로거에 첨부한다.


아래는 로그를 console 과 file 로 전달하는, 보편적(?)인 logback.xml 스트립트이다.


<?xml version="1.0" encoding="UTF-8"?>
 
<!-- 구성 파일을 수정하였을 때, logback-classic 이 변경 사항을 자동으로 반영하게 한다. -->
<!-- scanPeriod 값의 단위는 milliseconds (default), seconds, minutes, hours 단위로 입력할 수 있다. -->
<!-- StatusPrinter 클래스의 print() 메소드를 호출한 것과 동일하게 logback 의 내부 상태 출력 -->
<configuration scan="true" scanPeriod="30 seconds" debug="true">
 
    <!-- property 요소로 변수를 사용할 수 있다. (아래의 logDir 이나 HOSTNAME 등) -->
    <property resource="resource.properties"/>
 
    <!-- ConsoleAppender 는 거의 이 형식을 벗어나지 않는다. pattern 만 적절히 수정한다. -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
 
    <!-- RollingFileAppender 는 FileAppender 를 확장한 것으로 파일을 특정 조건에 맞게 로테이션 시키는데 유용하다. -->
    <!-- 아래의 로테이션 정책은 30일이 넘거나 총 파일 크기가 3GB 를 넘기면 오래된 순으로 삭제된다. -->
    <appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logDir}/logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
 
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
 
    <!-- 아래 logger 들로 특정 라이브러리들에 대한 logger 레벨과 appender 를 지정할 수 있다. -->
    <!-- 여기 지정된 logger 레벨은 root 레벨보다 우선한다. -->
 
    <!-- Hibernate Loggers -->
    <logger name="org.hibernate" level="ERROR">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILEOUT"/>
    </logger>
 
    <!-- springframework -->
    <logger name="org.springframework" level="ERROR">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILEOUT"/>
    </logger>
 
    <!-- ibatis and mybatis spring -->
    <logger name="org.apache.ibatis" level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILEOUT"/>
    </logger>
    <logger name="org.mybatis.spring" level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILEOUT"/>
    </logger>
 
    <!-- if, then, else 구문을 사용하여 서버 환경에 따른 스크립트를 하나의 파일에 동시에 설정할 수 있다. -->
    <!-- 아래는 root 레벨만 조정하였지만, appender-ref 를 변경할 수도 있다. -->
    <if condition='property("HOSTNAME").contains("prod")'>
        <then>
            <root level="info">
                <appender-ref ref="STDOUT"/>
                <appender-ref ref="FILEOUT"/>
            </root>
        </then>
        <else>
            <root level="debug">
                <appender-ref ref="STDOUT"/>
                <appender-ref ref="FILEOUT"/>
            </root>
        </else>
    </if>
</configuration>
cs


구성 파일을 구문 분석하는 동안 경고 또는 오류가 발생하면 Logback 은 내부 상태 데이터를 자동으로 콘솔에 출력한다.

구성 파일의 configuration 요소에 debug="true" 를 설정하면, 오류가 없는 경우에도 구성 파일에 상태 데이터를 출력할 수 있다.

이것은 코드에 StatusPrinter.print() 메소드를 사용한 것과 같은 결과로 나타난다.

또한 설정 파일의 statusListener 요소에 OnConsoleStatusListener 클래스를 설정하는 것과도 같다.





WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,