Logback 구성 파일을 사용하면 코드를 다시 컴파일 할 필요없이 logging 동작을 재정의 할 수도 있다.
구성 파일에 로그를 어떤 형태로 어디에 남길 것인지에 대한 계획도 명시할 수 있으며, 프로그래밍 방식이나 XML, Groovy 형식으로도 작성할 수 있다.
Logback 웹사이트에서 기존 log4j 사용자를 위한 PropertiesTranslator 도 제공한다. (log4j.properties -> logback.xml)
Logback 의 구성 파일 검색 순서
- classpath 에서 logback-test.xml 파일 검색.
- 없으면 logback.groovy 파일 검색.
- 없으면 logback.xml 파일 검색.
- 없으면 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
- 손가락귀신
정신 못차리면, 벌 받는다.