- 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번까지의 설정 방법은 나만의 방법이며

모든 개발자들에게 통용되는 방법은 아니다.

+ Recent posts