2020. 4. 6. 11:43ㆍJava/일반
1. LogBack이란
LogBack이란 Log4J를 만든 개발자 Ceki Gülcü가 Log4J를 기반으로 더 빠른 속도와 더 적은 메모리 점유율 등의 성능을 개발하여 만든 Logging Framework입니다.
2. LogBack의 특징
Level
로그에 레벨을 설정할 수 있습니다. 개발 시 디버깅을 위해 출력하도록 한 로그들은 개발 완료 후 운영 시점에서는 더 이상 출력하지 않게 합니다. 로그마다 레벨을 설정해두고 설정 파일에서 출력 로그 레벨을 설정하여 원하는 단계의 로그만 출력할 수 있습니다.
Appender
출력 방법을 선택할 수 있습니다. 로그의 기록을 담당하는 Appender에게 출력 위치(콘솔, 파일 등)나 출력 내용(날짜/시간, 레벨 등)에 대한 패턴을 설정할 수 있습니다.
Logger
로그마다 다른 설정 내용을 쉽게 적용시킬 수 있습니다. 위의 주요 설정을 포함한 다양한 설정 항목을 가지고 있는 객체(Logger)에 이름을 부여하여 필요한 상황에 맞게 적절한 Logger를 호출하여 사용할 수 있습니다.
Automatic Reloading Configuration File
설정 파일을 스캔하는 별도의 스레드를 두어 지정한 시간마다 설정 파일을 스캔해 프로그램의 재시작 없이 설정을 변경할 수 있습니다.
Automatic Compression / Removal
로그 파일을 생성할 때, 별도의 프로그램을 통해 압축을 진행할 필요 없이 자동 압축을 지원하며, 시간 또는 개수를 설정하여 설정한 시간이나 개수를 초과할 경우 로그 파일이 자동으로 삭제되도록 할 수 있습니다.
Graceful Recovery From I/O Failures
로그 기록 중에 장애가 발생할 경우, 서버 중지 없이 장애 발생시점으로부터의 자동 복구를 지원합니다.
If Statement
설정 파일에 조건문을 사용하여 세밀하게 로깅 설정하여 여러 환경에 맞게 자동 구성되도록 할 수 있습니다.
3. Logback의 설정 파일
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="LOGS_ABSOLUTE_PATH" value="./logs" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}][%-5level][%logger{36}] - %msg%n</pattern>
</encoder>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGS_ABSOLUTE_PATH}/logback.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="src.Main" level="debug" additivity="false">
<appender-ref ref="ROLLING" />
</logger>
<logger name="src.Main.Child" additivity="true" />
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Appender
- ConsoleAppender: 콘솔에 로그를 기록하는 방법
- FileAppender: 파일에 로그를 기록하는 방법
- RollingFileAppender: 여러 개의 파일을 순회하며 로그를 기록하는 방법
- SMTPAppender: 로그를 메일로 기록하는 방법
- DBAppender: 데이터베이스에 로그를 기록하는 방법
패턴에 사용되는 요소
- %Logger{length}: Logger name을 축약(length는 최대 자리 수)
- %thread: 현재 스레드 이름
- %-5level: 로그 레벨, -5는 출력의 고정폭 값
- %msg: 로그 메시지
- %n: 개행 문자
- %d : 로그 기록시간
- %p : 로깅 레벨
- %F : 로깅이 발생한 프로그램 파일명
- %M : 로깅일 발생한 메소드의 이름
- %l : 로깅이 발생한 호출지의 정보
- %L : 로깅이 발생한 호출지의 라인 수
- %t : 쓰레드 명
- %c : 로깅이 발생한 카테고리
- %C : 로깅이 발생한 클래스 명
- %m : 로그 메시지
- %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간
Log Level
ERROR < WARN < INFO < DEBUG < TRACE 라는 형식으로 되어 있으며 해당 레벨 이하의 것은 다 기록합니다.
Logger 객체
어느 패키지에 어떤 레벨의 로그까지 기록할 것인지를 명시해줍니다. Name 속성은 로그를 기록할 패키지 명을 나타내고 level은 패키지에 어떤 레벨의 로그까지 기록할 것인지를 명시해 줍니다. 그리고 additivity는 name 패키지 이하의 모든 파일에 적용할 것인지를 설정해줍니다.
'Java > 일반' 카테고리의 다른 글
NDC와 MDC (0) | 2020.04.11 |
---|---|
.map()과 .flatMap()의 차이 (0) | 2020.04.10 |
SLF4J (0) | 2020.04.03 |
Jar과 War의 차이 (0) | 2020.04.03 |
Java Logging (0) | 2020.04.03 |