배운 것
1. Log 레벨 설정
org.prgrms.kdt 에 log level 을 warn 으로 set 하면 org.prgrms.kdt 하위 class 는 전부 warn 로 set 된다.
특정 클래스에서 log level 설정을 다르게 하고싶으면 특정 클래스에서 원하는 레벨로 설정해주면 된다.
그럼 로그 레벨 설정은 어떻게 할까?
resources 하위에 logback.xml 파일을 만들어주고 기본 설정으로 다음과 같이 해주었다. 기본 설정은 공식 문서를 참고했다.
<!-- http://logback.qos.ch/manual/configuration.html -->
<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>
<logger name="chapters.configuration" level="INFO"/>
<!-- Strictly speaking, the level attribute is not necessary since -->
<!-- the level of the root level is set to DEBUG by default. -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
기본 설정을 보면 root level="DEBUG" 와 같이 되어있는데, 이는 root를 디버그 레벨로 설정한다는 뜻이다.
즉 root 하위 모든 클래스들이 디버그로 설정이 된다는 뜻.
그럼 특정 클래스의 로그 레벨을 다르게 하고싶으면 어떻게 해야할까 ? 아래와 같이 하면 된다.
<!-- http://logback.qos.ch/manual/configuration.html -->
<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>
<logger name="chapters.configuration" level="INFO"/>
<!--org.prgrms.kdt 하위 클래스 로그 레벨 설정, additivity="fasle" 는 아래 root level 출력과 중복되지 않도록 설정-->
<!--logger name="org.prgrms.kdt" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>-->
<!-- 위와 같은 코드-->
<logger name="org.prgrms.kdt" level="debug"/>
<!-- Strictly speaking, the level attribute is not necessary since -->
<!-- the level of the root level is set to DEBUG by default. -->
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
2. 로거 출력
로거 출력시에 아래와 같은 형식을 출력할 수 있는데, sout 으로 출력할때는 {0} {1} 와 같이 명시해주어야했지만 로거는 {} {} 와 같이 해주어도 된다.
logger.info("logger name => {} {}", logger.getName(), logger.getName());
3. conversion word
<property name="CONSOLE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> 와 같이 패턴을 설정하고 <pattern>${CONSOLE_LOG_PATTERN}</pattern> 처럼 패턴 레이아웃을 이용할 수 있다.
이때 로그백프레임워크 내부에서는 로깅 이벤트가 만들어지고 로깅이벤트가 문자열로 변환되는데 이때 conversion word를 이용한다.
<configuration>
<property name="CONSOLE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<logger name="org.prgrms.kdt" level="info"/>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
4. FileAppender
로그를 하나의 파일로 관리해보자!
<!-- http://logback.qos.ch/manual/configuration.html -->
<configuration>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/kdt.log</file>
<!-- 로그파일 덮어쓰기 여부 -->
<append>false</append>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<logger name="org.prgrms.kdt" level="debug">
<appender-ref ref="FILE" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
그런데! 하나의 파일이 아닌 다수의 파일로 관리하려면 어떻게 해야할까? 타임스탬프를 이용하여 로그를 다수의 파일로 관리할 수 있다.(실행될때마다 만들어짐) timestamp를 이용하여 중복되지않는 로그파일을 만들면 된다.
<!-- http://logback.qos.ch/manual/configuration.html -->
<configuration>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/kdt_${bySecond}.log</file>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<logger name="org.prgrms.kdt" level="debug">
<appender-ref ref="FILE" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
5. RollingFileAppender
파일로 로그를 남기게될 경우 대체로 RollingFileAppender를 많이 사용한다.
만약 배포를 한달에 한번한다고 가정해보자. application이 장시간 구동될텐데 하나의 파일로 관리를 하면 로그 파일이 매우 거대해진다.
용량이 커진다는 문제점이 있지만, 용량이 커지면 당연히 읽기도 어려워진다. 이를 보완하고자 RollingFileAppender를 사용하고, 대체로 일 기준으로 로그 파일을 분할한다.
ch.qos.logback.core.rolling.TimeBasedRollingPolicy 는 특정 시간이 지나면 파일이 만들어진다.
RollingFileAppender 는 RollingPolicy 와 TriggeringPolicy를 정의해야한다.
RollingPolicy 는 무얼, 어떻게 만들것인지를 정의하고
TriggeringPolicy 는 트리거 되는 순간(시간이 될 수 도 있고, 파일 용량 이 될 수도 있음)을 정의한다.
로그 파일을 만들 때 다음과 같은 방식으로 로그 파일을 만들 수 있는데,
version1
로그 파일 기록을 항상 1일 단위로 갱신하고, 오늘 날짜를 2021-08-23 일 이라고하면
version1 처럼 기록이 된다. access.log 파일에는 항상 당일 날짜에 대한 로그가 담겨있다. 날짜가 바뀌면
access-2021-08-23.log 파일이 생성되고, access.log 파일에는 2021-08.24일 로그가 담기게 된다.
<configuration>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<logger name="org.prgrms.kdt" level="info">
<appender-ref ref="ROLLING_FILE" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
version2
항상 날짜 단위를 기준으로 파일이 생성된다.
오늘이 2021-08-23일 이라면 access-2021-08-23일이 되는 시점에 access-2021-08-23파일이 생성되고, access-2021-08-23 로그 정보가 기록된다.
<configuration>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<logger name="org.prgrms.kdt" level="info">
<appender-ref ref="ROLLING_FILE" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
6. logger 출력 색 바꾸기(콘솔로그에만 색 설정해주기)
//로거 사용할 곳에 AnsiOupput 설정해주기
AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
<configuration>
<conversionRule
conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{HH:mm:ss.SSS}){cyan} [%thread] %clr(%-5level) %logger{36} - %msg%n"/>
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<logger name="org.prgrms.kdt" level="info">
<appender-ref ref="ROLLING_FILE" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
ref
http://logback.qos.ch/manual/configuration.html
Chapter 3: Configuration
Chapter 3: Logback configuration In symbols one observes an advantage in discovery which is greatest when they express the exact nature of a thing briefly and, as it were, picture it; then indeed the labor of thought is wonderfully diminished. —GOTTFRIED
logback.qos.ch
http://logback.qos.ch/manual/layouts.html (conversion word)
Chapter 6: Layouts
Chapter 6: Layouts 和訳 (Japanese translation) TCP implementations will follow a general principle of robustness: be conservative in what you do, be liberal in what you accept from others. —JON POSTEL, RFC 793 What is a layout? In case you were wonderi
logback.qos.ch
'TIL > 2021' 카테고리의 다른 글
[TIL] 0824 JDBC (Java Database Connectivity) (0) | 2021.08.24 |
---|---|
[TIL] 0823 테스팅에 대해 알아보자 (0) | 2021.08.23 |
[TIL] 0820 우선순위를 명확하게 (0) | 2021.08.21 |
[TIL] 0818 Spring 컴포넌트 (0) | 2021.08.18 |
[TIL] 0813 Database 이것저것5 (0) | 2021.08.13 |