시스템을 작동할 때 시스템의 작동 상태의 보존, 이용자의 습성 조사 및 시스템 동작의 분석 등을 하기 위해 작동 중의 각종 정보를 기록해둘 필요가 있다. 이 기록을 만드는 것을 로깅이라 한다. 즉 로그 시스템의 사용에 관계된 일련의 사건을 시간의 경과에 따라 기록하는 것이다
- 네이버 지식백과 : 로깅
자바에는 다양한 로깅 프레임워크가 있다.
Simple Logging Facade for java
로깅 프레임워크들을 추상해 놓은 프레임워크. Facade 패턴을 사용한다
SLF4J의 바인딩 모듈을 통해 다양한 로깅 프레임워크를 지원한다
로깅 프레임워크 설정만 바꾸면 코드의 변경 없이 바꿀 수 있다
각 로그는 레벨이 주어진다
로그 레벨을 설정해 원하는 수준의 로그만 표시할 수 있다
// 로거 선언 및 생성
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// 클래스의 canonical 이름을 주입해 패키지 수준에 따른 로깅 설정, 확인 등도 가능하다
final Logger log = new LoggerFactory.getLogger(this.getClass());
// log.로그레벨(메시지);
log.info("this is a info log");
log.error("error -> {}", error);
Logback은 다음 순서대로 설정을 찾는다. 설정 파일이 없을 시 다음 우선순위 설정 파일을 찾는 방식이다. 문법을 외울 필요는 없지만, 혼자 찾아보며 수정을 할 수 있도록 익숙해지자
Logback 설정 문서 : http://logback.qos.ch/manual/configuration.html
<!-- src.main.resources.logback.xml -->
<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="org.package.SomeClass" level="info"/>
<root level="warn">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
<property>
변수를 선언하듯 속성을 설정<appender>
어디에 어떤 포멧으로 로그를 남길지 설정<logger>
로거의 위치에 따른 설정<root>
루트 로거 설정%색상(서브패턴)
으로 추가할 수 있다%highlight
을 레벨에 적용해 레벨마다 색상이 다르게 할 수 있다 // 시간을 빨간색으로 표시하기
%red(%d{HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %logger{36} - %msg%n
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/${bySecond}}.log</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="warn">
<appender-ref ref="FILE"/>
</root>
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 오늘의 로그는 access.log 파일에 저장 -->
<file>logs/access.log</file>
<!-- 날짜를 기준으로 rolling 하도록 설정 -->
<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>
<root level="warn">
<appender-ref ref="ROLLING_FILE"/>
</root>