티스토리 뷰

로깅(Logging)

로깅이란 시스템이 동작하는 동안의 시스템의 상태, 동작 정보 등을 기록하는 것이다. 이것을 통해 애플리케이션의 문제를 진단할 수도 있고 데이터를 수집하여 분석 자료로써 활용할 수 있다.

로깅 구현체

대표적으로 Log4j와 Slf4j의 구현체인 Logback이 있다.

Log4j는 가장 오래된 자바 기반 로깅 프레임워크이며 Logback은 Log4j의 아키텍처 기반으로 재작성된, 스프링부트에 기본적으로 포함된 로깅 프레임워크이다.

 

Logback

Log4j에 비해 향상된 필터링 기능, 로그 레벨 변경 등에 대해 서버를 재시작할 필요없이 자동 리로딩을 지원한다는 장점이 있다.

로그 레벨

Logback은 5단계의 로그 레벨을 가진다.
로그는 설정 레벨과 설정 레벨 상위의 로그만 추적한다.
(ex: INFO레벨로 설정한다면 DEBUG와 TRACE는 추적하지 않는다.)
높은 레벨에서 낮은 레벨의 순서로 본다면 아래와 같다.

  • ERROR : 예상하지 못한 심각한 문제가 발생하는 경우, 프로그램이 종료됨
  • WARN : 당장 서비스 운영에는 영향이 없지만 주의해야 할 부분
  • INFO : 운영에 참고할만한 사항
  • DEBUG : 개발 단계에서 사용하며, SQL 로깅을 할 수 있음
  • TRACE : 모든 레벨에 대한 로깅을 추적

 

DEBUG와 TRACE 단계는 너무 많은 로그가 쌓일 수 있기 때문에 개발 단계에서만 사용하는 것이 좋다고 한다!

 

로그 파일 설정

로그 파일을 설정하는 방법에는 application.yml 에서 설정하는 방법과 logback-spring.xml 로 관리하는 방법이 있는데 세부적으로 설정하려면 xml 파일로 관리하는 게 좋은 것 같다.

 

src/main/resources/logback-spring.xml

src/main/resources/appender/console-appender.xml

 

위 두 가지 경로로 설정하는 간단한 예시를 기록해보고자 한다.

appender 같은 경우 레벨에 따라 기록의 위치나 패턴 등 세팅을 다르게 가져가는 경우도 많기 때문에 여러 파일로 나누어서 작성될 여지가 있다는 것을 생각해서 따로 폴더링해서 include/included 하는 방식으로 구현해보았다.

 

설정 요소

크게 AppenderLogger 두 부분으로 나누어볼 수 있다.

Appender (어디에 기록할까?)

로그의 출력 위치, 출력 형식 등을 지정

  • logback-core 모듈
    • ConsoleAppender : 콘솔에 출력
    • FileAppender : 파일에 로그 기록
    • RollingFileAppender : 여러개의 파일을 순회하며 로그 기록
  • logback-class 모듈(원격 로그 기록)
    • SMTPAppender : 메일에 로그 기록
    • DBAppender : 데이터베이스에 로그 기록

 

Logger (어떻게 기록할까?)

설정한 appender를 참조하여 실제 로깅을 수행하는 구성요소

  • 출력레벨 조정
    • TRACE < DEBUG < INFO < WARN < ERROR
    • 지정된 메서드 아래 level은 출력되지 않음
    • 기본 LEVEL은 DEBUG

 

로그 파일 작성하기

설정 시작

src/main/resources/logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 이 곳에 추가할 기능을 넣는다. -->
    <timestamp key="DATE_FORMAT" datePattern="yyyy-MM-dd" />  

    // 속성 및 변수 설정
    <property name="CONSOLE_LOG_PATTERN" value="%highlight([%-5level]) %d{yyyy-MM-dd HH:mm:ss} %cyan([%thread]) %magenta([%logger{0}:%line]) - %message %n" />

    // import와 유사한 기능. resource에 지정한 경로의 파일을 불러온다.
    <include resource="appender/console-appender.xml" />

</configuration>

property에서 설정한 패턴은 아래와 같은 형태로 출력된다.

 

Appender 작성

src/main/resources/appender/console-appender.xml

// export와 유사한 기능
<included>
    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>${CONSOLE_LOG_PATTERN}</pattern> 
        </encoder>  
    </appender>  
</included>

Pattern에서 지정한 방식대로 콘솔에 메시지를 출력한다. 해당 appender는 name에 설정한 CONSOLE_APPENDER라는 변수명에 저장해두었다고 생각하면 된다.

또한 pattern 부분은 src/main/resources/logback-spring.xml 의 property에서 설정한 CONSOLE_LOG_PATTERN을 불러온 것이다.

 

Logger 작성

src/main/resources/logback-spring.xml

<!-- 전체 로그 출력 설정 -->
<root level="INFO">

<!-- 설정한 appender 추가, ref는 appender에서 설정한 name과 일치하는 appender를 가져온다 -->
    <appender-ref ref="CONSOLE_APPENDER" />  
</root>
 
[참고] Log Pattern

로그 설정에 사용되는 패턴

  • %logger: 패키지 포함 클래스 정보
  • %logger{0}: 패키지를 제외한 클래스 이름만 출력
  • %logger{length}: Logger name을 축약할 수 있음. {length}는 최대 자리 수, ex)logger{35}
  • %-5level: 로그 레벨, -5는 출력의 고정폭 값(5글자), 로깅레벨이 Info일 경우 빈칸 하나 추가
  • ${PID:-}: 프로세스 아이디
  • %d: 로그 기록시간 출력
  • %p: 로깅 레벨 출력
  • %F: 로깅이 발생한 프로그램 파일명 출력
  • %M: 로깅일 발생한 메소드의 명 출력
  • %line: 로깅이 발생한 호출지의 라인(=%L)
  • %thread: 현재 Thread 명(=%t)
  • %c: 로깅이 발생한 카테고리
  • %C: 로깅이 발생한 클래스 명 (%C{2}는 somePackage.SomeClass 가 출력됨)
  • %m: 로그 메시지(=%msg, =%message)
  • %n: 줄바꿈(new line)
  • %%: %를 출력
  • %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)
  • %d{yyyy-MM-dd-HH:mm:ss:sss}: %d는 date를 의미하며 중괄호에 들어간 문자열은 dateformat을 의미. 따라서 [2021-07-12 12:42:78]과 같은 날짜가 로그에 출력됨.
  • %-4relative: %relative는 초 아래 단위 시간(밀리초)을 나타냄. -4를하면 4칸의 출력폼을 고정으로 가지고 출력. 따라서 숫자에 따라 [2021-07-12 12:42:78:232] 혹은 [2021-07-12 12:42:78:2332]와 같이 표현됨

 

전체 설정 코드

logback-spring.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <timestamp key="DATE_FORMAT" datePattern="yyyy-MM-dd" />

    <property name="CONSOLE_LOG_PATTERN" value="%highlight([%-5level]) %d{yyyy-MM-dd HH:mm:ss} %cyan([%thread]) %magenta([%logger{0}:%line]) - %message %n" />

    <include resource="appender/console-appender.xml" />

    <root level="INFO">
        <appender-ref ref="CONSOLE_APPENDER" />
    </root>
</configuration>
 
appenders/async-console-appender.xml
<included>
    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
</included>

관련 자료

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함