문서의 이전 판입니다!
logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>▶ %-5level %d{HH:mm:ss.SSS} [%thread] %class{36}.%method:%line - %msg%n</pattern> </encoder> </appender> <logger name="org.springframework" level="INFO" /> <root level="info"> <appender-ref ref="console" /> </root> </configuration>
logback.groovy
def HOSTNAME = hostname // scope 룰 때문에 nested block에서는 hostname 변수 사용불가 appender('console', ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = "▶ %-5level %d{HH:mm:ss.SSS} [${HOSTNAME}] [%thread] %logger{36} - %msg%n" } } root(INFO, ['console'])
appender('daily', RollingFileAppender) { file = "/logs/daily.log" append = true rollingPolicy(TimeBasedRollingPolicy) { fileNamePattern = "/logs/daily.log.%d{yyyy-MM-dd}.gz" // 자동 gz 압축 maxHistory = 10 // 10일간만 보관 } encoder(PatternLayoutEncoder) { pattern = '%-5level %d{yyyy-MM-dd HH:mm:ss} [%thread] %logger{36} - %msg%n' } // 특정 레벨 이상만 로깅 filter(ch.qos.logback.classic.filter.ThresholdFilter) { level = INFO // INFO 이상 레벨만 로깅 } // 마커가 필요할 때 filter(EvaluatorFilter) { evaluator(ch.qos.logback.classic.boolex.OnMarkerEvaluator) { marker = '마커이름' marker = '또다른마커이름' } onMismatch = DENY onMatch = NEUTRAL } }
appender('fixedWindowRollingFile', RollingFileAppender) { file = '/logs/fixedWindowRollingFile.log' append = true encoder(PatternLayoutEncoder) { pattern = '%-5level %d{yyyy-MM-dd HH:mm:ss} [%thread] %logger{36} - %msg%n' } rollingPolicy(ch.qos.logback.core.rolling.FixedWindowRollingPolicy) { fileNamePattern = '/logs/fixedWindowRollingFile.log.%i' minIndex = 1 // xx.log.1 ~ xx.log.5 maxIndex = 5 } triggeringPolicy(ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy) { maxFileSize = '100MB' // 파일 크기 100MB될때마다 롤링 } }
LogbackConfigListener
설정시 리스너는 선언 순서에 따라 실행되므로 로깅 관련 리스너를 최상단으로 올려서 로깅 정책이 처음 부터 적용될 수 있도록 처리할 것.A.add(B)
는 A extends B
와 유사하다. 즉, A는 B를 상속하므로, B를 처리하는 어펜더는 A도 함께 처리할 수 있다.ch.qos.logback.ext.spring.web.LogbackConfigListener
혹은 LogbackConfigServlet
사용시 서블릿 컨텍스트 종료시 자동 종료되도록 등록 되는 듯 보임.// assume SLF4J is bound to logback-classic in the current environment LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); loggerContext.stop();
<configuration debug="true"> <!-- in the absence of the class attribute, assume ch.qos.logback.core.hook.DelayingShutdownHook --> <shutdownHook/> .... </configuration>