- Logback이란?
log4j는 Ceki Gulcu라는 개발자가 최초로 만듦.
Ceki Gulcu가 log4j를 통해서 더 나은 Logger에 대한 깊은 프로젝트를 시작하여 탄생한 것이 SLF4J와 Logback 이다.
SLF4J는 로깅 구현제라기 보다는 Logging Facaed.
-> SLF4J의 API를 사용하면, 구현체의 종류와 상관없이 "일관된 로깅 코드"가 작성가능 하며 여러 Logging 구현체들을 변경이 최소한의 수정으로 가능하다.
http://logback.qos.ch/ 홈페이지 처음 이런 말을 한다.
Logback is intended as a successor to the popular log4j project, picking up where log4j leaves off. 즉. logback은 log4j 후계자다. |
- 왜 Logback을 사용해야 하는가?
(https://beyondj2ee.wordpress.com/2012/11/09/logback-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-reasons-to-prefer-logback-over-log4j/ 내용 참고하여 재 작성)
1) faster implementation
-> logback은 오랫동안 검증된 log4j 아키텍쳐를 기반으로 재작성 됨.
-> 특히 성능은 약 10배정도 개선, 메모리 점유도 보다 적게 사용.
2) extensive battery of tests
-> log4j시절 부터 오랜기간 동안 광범위한 테스트가 진행되었고 logback은 더 많은 테스트의 반복과정을 수행.
- 높은 퀄리티 보장.
3) logback-classic speaks SLF4J natively
-> logback은 3가지 컴포넌트로 구성
1) logback-core : 핵심 코어 컴포넌트
2) logback-classic : slf4j에서 사용가능하도록 만든 플러그인 컴포넌트
3) logback-access : HTTP 요청에 대한 강력한 디버깅 기능 제공하는 컴포넌트
4) extensive documentation
-> 레퍼런스 매뉴얼 제공. 지속적이면서 상세한 메뉴얼 제공
5) configuration files in XML or Groovy
-> logging 설정에 대한 syntax는 기본적으로 XML 형태
-> Grooby syntax도 지원.
6) automatic reloading of configuration files
7) graceful recovery form I/O failures
8) automatic removal of old log archives
9) automatic compression of archived log files
10) prudent mode
-> 하나의 서버에서 "다수의 JVM"이 기동 중일 경우 "하나의 파일"에 로그 수집하고자 할때 사용하는 기능.
11) Lillith
-> 현재 발생하는 로그 이벤트에 대한 상태 정보를 볼 수 있도록 지원하는 뷰어
12) conditional processing of configuration files.
13) filters
-> 로깅을 남길지, 말지 행들링 하는 기능.
14) sifting Appender
-> filter기능과 유사하지만 다른 기능 제공.
-> 로그 파일을 특정 주제별로 분류
(ex. HTTP Session별, SQL 명령어 별, PG결제 별 등등)
15) stack traces with packaging data
-> Exception 발생 시 참조했던 외부 라이브러리 버전 출력 기능.
16) logback-access, i.e HTTP-access logging wih brains, is an integral part of logback
-> HTTP 디버깅 제공.
Spring Framework 프로젝트 생성 시
slf4j, log4j dependency가 자동 적용되어 있는 것 같다.
해당 라이브러리가 적용된 것을 확인 후 아래와 같이 진행.
(logback-core.jar, logback-classic, log4jdbc-log4j2-jdbc4.jar 등 적용
http://logback.qos.ch/ 참고)
아래와 같이 Logback 적용
1. src/main/resources
-> logback.xml 추가
(환경 별 logback 설정 파일을 호출하기 위한 proxy 파일이라고 보면 됨.)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <configuration scan="true" scanPeriod="5 seconds" debug="true"> <if condition='isDefined("spring.profiles.active")'> <then> <include resource="runtimeEnv/logback-${spring.profiles.active}.xml" /> </then> </if> </configuration> |
2. src/main/java/runtimeEnv 패키지 생성
- logback.shared.xml 생성
- 공통 환경 변수 설정, Appender 설정.
(실제 logback 환경별 설정 - appender설정, rolling 설정 등)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <included scan="true" scanPeriod="2 seconds"> <!-- 공통 환경변수 설정 --> <property name="APP_NAME" value="프로젝트 이름"/> <property name="LOG_FILENAME" value="로그 파일 명" /> <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} %-5level: %c{50}.%method\\(\\) (%file:%line\\) - %msg%n" /> <property name="LOG_CHARSET" value="UTF-8" /> <!-- Appenders 설정 --> <!-- CONSOLE: 콘솔로 출력 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${APP_NAME} ${LOG_PATTERN}</pattern> <charset>${LOG_CHARSET}</charset> </encoder> </appender> <!-- FILE: CURRENT 현재 인스턴스 시작부터 로깅 (개발용. 실서버에서는 일자별로깅의 오늘자 로그 조회) --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${FILE_LOG_FOLDER}/${LOG_FILENAME}.CURRENT.log</file> <append>false</append> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>${LOG_CHARSET}</charset> </encoder> </appender> <!-- ROLLING: 일자별 로깅 (지난파일 압축하여 N개유지) --> <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${FILE_LOG_FOLDER}/${LOG_FILENAME}.%d{yyyyMMdd}.log.zip</fileNamePattern> <maxHistory>31</maxHistory> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <append>true</append> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>${LOG_CHARSET}</charset> </encoder> </appender> <!-- ROLLING: 일자별 로깅 - WARN LEVEL Threshold (지난파일 압축하여 N개유지) --> <appender name="ROLLING_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${FILE_LOG_FOLDER}/${LOG_FILENAME}.%d{yyyyMMdd}.WARN.log.zip</fileNamePattern> <maxHistory>31</maxHistory> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <append>true</append> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>${LOG_CHARSET}</charset> </encoder> </appender> </included> |
3. logbak-환경.xml
- 환경은 local, dev, stage, qa, real, production 등 입맛대로 사용.
- 단, spring.profiles.active 값과 일치해야함.
(개별 logging 정책, log 레벨 설정 등)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <included scan="true" scanPeriod="2 seconds"> <!-- 환경변수 설정 --> <property name="FILE_LOG_FOLDER" value="로그 저장 경로" /> <!-- 공용파일 --> <include resource="runtimeEnv/logback.shared.xml" /> <!-- 개별 LOGGING 정책 설정 --> <logger name="XXXXXXXX" level="DEBUG" /> <logger name="framework.log.ControllerLoggingAspect" level="DEBUG" /> <logger name="jdbc.sqlonly" level="ERROR" /> <logger name="jdbc.sqltiming" level="INFO" /> <logger name="jdbc.audit" level="ERROR" /> <logger name="jdbc.resultset" level="ERROR" /> <logger name="jdbc.resultsettable" level="INFO" /> <logger name="jdbc.connection" level="ERROR" /> <logger name="org.mybatis" level="INFO" /> <logger name="org.apache.commons.digester" level="INFO"/> <logger name="org.apache.http" level="INFO" /> <logger name="org.springframework" level="INFO" /> <!-- ROOT LEVEL LOGGING 정책 설정 --> <root level="DEBUG"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> <appender-ref ref="ROLLING" /> <appender-ref ref="ROLLING_WARN" /> </root> </included> |
위 3번까지의 설정 방법은 나만의 방법이며
모든 개발자들에게 통용되는 방법은 아니다.