티스토리 뷰

2) slf4j 설정하기

SLF4J?

  • logging 관련 라이브러리는 다양하다.
  • 이러한 라이브러리들을 하나의 통일된 방식으로 사용할 수 있는 방법을 SLF4J는 제공한다.
  • SLF4J는 로깅 Facade이다.
  • 로깅에 대한 추상 레이어를 제공하는 것이고 interface의 모음이다.

SLF4J를 이용해 로깅 라이브러리 사용하기

  • 녹색의 application들은 하늘색의 SLF4J를 사용하고 있습니다.
  • application SLF4J를 사용함으로써 로깅 라이브러리로 어떤 것을 사용하던지 같은 방법으로 로그를 남길 수 있게 됩니다.
  • 이런 방식의 장점은 나중에 더 좋은 로그 라이브러리가 등장하게 돼서 로그 라이브러리를 교체한다고 하더라도 application의 코드는 변경될 필요가 없습니다.

maven SLF4J logback의존성 추가하기

  • 참고로 logback-classic 1.2.3은 이미 slf4j-api 1.7.25에 대한 의존성을 가지고 있기 때문에 slf-j-api를 추가할 필요는 없다.
  • Spring은 기본적으로 아파치 재단의 commons-logging을 사용한다.
  • logback라이브러리를 사용하려면 commons-logging을 제거해야한다.
  • Spring라이브러리에서 commons-logging을 제거하면, Spring을 사용할 때 commons-logging라이브러리를 찾으면서 오류(ClassNotFoundException)가 발생한다.
  • 이러한 오류를 제거하기 위해서 jcl-over-slf4j를 추가한다. Spring commons-logging 대신에 jcl-over-slf4j를 이용해서 로그를 남기게 되는 형식이다.

logback 설정

  • SLF4J는 로그를 남기기 위한 공통 인터페이스라서 실제로 로그를 남기는 것은 logback 라이브러리이므로 logback 설정을 해줘야 합니다.
    • logback.xml -> logback 설정파일이며 루트요소는 configuration이고 해당 루트요소 안에는 appender, logger, root 등에 대한 설정을 하게 됩니다.
    • Appender 설정
    • logger 설정
    • root 설정

Appender

  • 어디에 어떤 포맷으로 로그를 남길 것인지를 정할 수 있는 방법을 제공하는 겁니다. 대표적으로는 ConsoleAppender, FileAppender, RollingFileAppender 등이 있습니다.
    • ConsoleAppender : 콘솔에 로그를 어떤 포맷으로 출력할지를 설정할 때 사용한다.
    • FileAppender : 파일에 로그를 어떤 포맷으로 출력할지를 설정한다.
    • RollingFileAppender : 로그의 양이 많아지면, 하나의 파일로 관리하기 어려워지는 경우가 생긴다. 이런 문제를 해결하기 위해 하루 단위로 로그를 관리하고자 할 경우 사용된다.

ConsoleAppender 설정

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

        <encoder>

            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>

        </encoder>

    </appender>

  • appender 요소 안에 name을 보통 CONSOLE이라고 지정합니다.
  • class ConsoleAppender를 지정합니다.
  • encoder 엘리먼트 안에 Pattern이라는 요소에는 로그를 출력할 형태 포맷을 지정하게 됩니다.
  • Pattern에서 %logger logger의 이름을 축약해서 출력을 하고 중괄호 안에 있는 것은 length를 의미합니다.
  • %-5level은 로그 레벨을 5의 고정폭 값으로 출력하라는 것을 의미합니다.
  • %msg %message alias로 사용자가 출력한 메시지가 출력됩니다.
  • %n은 줄 바꿈 입니다.
  • %d의 뒤에 나오는 것은 시간을 의미합니다.

 

RollingFileAppender 설정

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>access.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>access-%d{yyyy-MM-dd}.log</fileNamePattern>

            <maxHistory>30</maxHistory>

        </rollingPolicy>

        <encoder>

            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>

        </encoder>

    </appender>

  • class 항목에서 RollingFileAppender를 선언합니다. 그리고 여기서 appender 이름을 FILE로 설정하고 있습니다.
  • 기본적으로 기록되는 파일명은 access.log이고요디렉토리 경로가 없기 때문에 이클립스에서 실행을 하게 되면 이클립스 설치 경로에 로그 파일이 생성이 됩니다.
  • rollingPolicy 엘리먼트의 class를 TimeBasedRollingPolicy로 받으면 일자 별로 로그파일을 백업합니다. 엘리먼트 안에서 파일이 백업되는 형식를 결정짓기 위해 fileNamePattern 엘리먼트를 사용합니다.
  • access-로 시작하면서 년, , 일에 대한 정보를 가지고 있는 로그 파일이 최대 30개 생성됩니다. , 이전의 로그 파일들은 삭제됩니다.
  • encoder의 Pattern 엘리먼트 안에서는 로그를 출력할 형태를 지정할 수 있습니다.

 

Log Level

  • trace : debug보다 세분화된 정보
  • debug : 디버깅하는데 유용한 세분화된 정보
  • info : 진행상황 같은 일반 정보
  • warn : 오류는 아니지만 잠재적인 오류 원인이 될 수 있는 경고성 정보
  • error : 요청을 처리하는 중 문제가 발생한 오류 정보

로그 레벨 설정과 root 설정

<logger name="org.springframework" level="info"/>

    <logger name="kr.or.connect" level="debug"/>

    <root level="debug">

        <appender-ref ref="CONSOLE"/>

        <appender-ref ref="FILE"/>

    </root>

  • logback 설정에서 logger라는 엘리먼트는 어떤 패키지 이하의 클래스에서 어떤 레벨 이상의 로그를 출력할지를 결정할 때 사용합니다.
  • 위의 내용은 org.springframework로 시작하는 패키지에 속한 클래스에서 출력하는 로그는 info 이상의 레벨 로그를 출력하라는 의미입니다즉, info, warn, error와 같은 관련된 로그가 기록됩니다.
  • 그리고 두 번째 logger는 kr.or.connect 패키지를 가리킵니다. 해당 패키지에 속한 클래스에서 출력하는 로그는 debug 이상 레벨로 출력하라는 의미입니다.
  • root 태그에 설정한 것은 CONSOLE FILE Appender를 적용하라는 것을 의미합니다즉, CONSOLE FILE 양쪽에 로그를 출력하게 됩니다.

 

Logger 객체 선언

  • 로그를 남기고자 하는 클래스에 로거 객체를 필드로 선언한다.

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

.......

private Logger logger = LoggerFactory.getLogger(this.getClass());

  • 로그 설정을 했다면 로그를 남기기 원하는 클래스에서 SLF4J 라이브러리를 이용해서 로그를 남기면 됩니다.
  • org.slf4j 패키지의 LoggerFactory를 이용해서 logger 객체를 생성하시면 됩니다.

 

로그 출력 메소드

  • 문자열 결합을 위해 '+'연산자를 사용하지 않는다.
    스트링을 + 연산자를 이용해서 연결을 하면은 속도가 굉장히 느려집니다. SLF4J의 로그 출력 메서드의 첫 번째 인자로는 출력할 로그 문자열을 넣게 되고 두 번째부터는 가변 인자를 받습니다.(가변 인자란 0개 이상의 인자를 전달할 수 있다는 것을 의미합니다)
  • 로그로 남길 변수의 수만큼 {} 를 이용한다.
    문자열의 변수를 출력하고 싶다면 변수를 출력할 위치에 중괄호를 열고 닫고 넣습니다. 중괄호 열고 닫고의 수만큼 로그의 문자열 뒤에 가변 인자로 넘겨주게 됩니다.
  • 로그의 수준에 따라 debug(), info(), warn(), error()메소드를 이용한다.

logger.trace("{} {} 출력", "1", "2");

logger.debug("{} {} 출력", "1", "2");

logger.info("{} {} 출력", "1", "2");

logger.warn("{} {} 출력", "1", "2");

logger.error("{} {} 출력", "1", "2");

 

생각해보기

  • 개발하는 컴퓨터에서 웹 어플리케이션을 실행할 때와 운영환경에서 웹 어플리케이션을 실행할 때 로그를 남기는 방법이 다릅니다. 개발할 때는 콘솔에 로그를 출력하는 것이 편하지만 실제 운영을 할 경우에는 파일로 로그릴 기록하는 것이 좋습니다. 이렇게 환경에 따라서 다른 설정파일을 사용하는 경우가 종종 있습니다. 이런 경우 설정파일을 어떻게 관리하는 것이 좋을까요?

    paradise****                                   2018.08.19
    감사합니다.
    -------------------------------------------------------------

    생각하기에 대한 이야기를 드리면, 용도에 따라 폴더별로 나누어서 관리합니다.
    용도에 따른 분류 기준은 찾으시면 나오겠지만 간단하게 이야기 드리면 다음과 같습니다.
    local(개인개발), dev(공통개발), stage(운영과 동일한 테스트 환경), production(운영)

참고 자료

[참고링크] Logback Project

https://logback.qos.ch

[참고링크] How to use logback

https://github.com/sonegy/how-to-use-logback

 

Comments