백엔드 (Back-End)/스프링 (Spring)

<Spring> 로깅 프레임워크 (Log4j, Log4j2, Slf4j, Logback)

xxvigrufv 2022. 10. 13. 09:30
반응형



로그(Log)는 기록을 남기는 것을 의미한다. 

로그를 통해 소프트웨어의 개발이나 운영 시 발생하는 문제점을 파악할 수 있다.
오류가 발생했을때 가장 먼저 확인하는 것이 로그이므로, 로그를 남기는 것은 굉장히 중요하다.
Java에서는 Log4j, Log4j2, Slf4j, Logback 등 다양한 로깅 프레임워크가 존재한다.

1.Log4j
Apache Log4j 는 다른 로깅 프레임워크에 비해 아파치 재단의 가장 오래된 프레임워크이다. 
콘솔 및 파일 출력의 형태로 로그를 남길 수 있으며, xml이나 properties 환경으로 구성할 수 있다. 
Apache 공식문서에서는 2015년 8월을 끝으로 Log4j는 개발이 중단되었으며, Log4j2로 업그레이드 할 것을 권장한다고 한다.

로그 레벨은 FATAL > ERROR > WARN > INFO > DEBUG > TRACE 순서를 가지며,
DEBUG을 로그 레벨로 지정하면 상위 레벨인 FATAL ~ DEBUG까지 로그가 출력이 된다.

관련 전문은 https://xxvigrufv.tistory.com/2 참고 바람. 


Log4j 는 더이상 지원하지 않으니 여기까지만 하겠다. 

2. Log4j2
 Apache Log4j2 는 이전 버전인 Log4j 1.x에 비해 상당히 개선된 Log4j의 업그레이드 된 버전으로 Logback 아키텍쳐에 내재된 몇 가지 문제를 해결하면서 Logback에서 사용할 수 있는 로깅 프레임워크이다.
Logback처럼 필터링 기능과 자동 리로딩을 지원하며, 차이점은 멀티 스레드 환경에서 비동기 로거(Async Logger)는 다른 로깅 프레임워크보다 처리량이 훨씬 많고, 대기 시간이 훨씬 짧다. 또한 Java8에 도입된 람다식을 지원하고, Lazy Evaluation을 지원한다.

Log4j 1.x 버전과의 차이점은 다음과 같다.

ⓐ신뢰성 향상: Log4j 1.x이나 Logback과 같이 프레임워크를 재구성하는 동안 메시지가 손실되지 않는다
ⓑ확장성: Log4j2는 사용자가 커스텀 컴포넌트를 구성하고 정의할 수 있도록 플러그인 시스템을 지원한다.
ⓒ간단한 구성 문법
ⓓxml, json, yaml, properties 속성 지원
ⓔ개선된 filters
ⓕ환경파일, 시스템 속성, 환경 변수, ThreadContextMap, 이벤트에 정의된 값에 대한 Property 조회 지원
ⓖ다중 API 지원: Log4j2는 Log4j2, Log4j, Slf4j, Commong Logging 및 julva.util.logging(JUL) API를 사용하는

                           응용 프로그램과 함께 사용할 수 있다.
ⓗ사용자 커스텀 로그 레벨
ⓘ"Lazy Logging"을 위한 Java8 스타일의 람다 지원
ⓢ향상된 속도

3.Slf4j
Slf4j(Simple Logging Facaed for Java) 는 자체적인 로깅 프레임워크가 아닌 logger의 추상체로서 다른 로깅 프레임워크가 접근할 수 있도록 도와주는 추상화 계층이다. 
즉, Log4j나 Logback와 같은 로깅 프레임워크의 인터페이스 역할을 한다.
따라서 Slf4j를 이용하면 로깅 프레임워크가 다른 구현체로 변경되더라도 코드를 유연하게 수정할 수 있는 장점이 있다.

4.Logback
 Logback 은 Log4j보다 향상된 로깅 프레임워크로 가장 널리 사용되고 있다. 
 이전에 소개드린  Slf4j 의 구현체로써 동작하는 Logback은 제가 주로 사용하고 있는 스프링부트의 경우 spring-boot-starter-web 의존성 내부에 logback 라이브러리가  기본적으로 포함되어 있기 때문에 추가적인 설정 없이 사용이 가능한다.
 
#Logback 예제
 -> resources 디렉토리 하위에 logback.xml 파일 추가(File)

 <?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <!-- 콘솔로 로그를 남김 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <Pattern>
                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
            </Pattern>
        </encoder>
    </appender>

    <!-- 파일로 로그를 남김 -->
    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/Users/juhyun/Desktop/study/logback.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
            </Pattern>
        </encoder>

        <!-- 로그 파일이 10KB가 넘으면 새로운 로그 파일로 만드는 정책 -->
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10KB</MaxFileSize>
        </triggeringPolicy>

        <!-- 파일을 덮어쓰는 정책 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <FileNamePattern>/Users/juhyun/Desktop/study/logback2.%i.log.zip</FileNamePattern>
            <!--
                MinIndex, MaxIndex => 로그 파일 정책
                logback2.1.log.zip, logback2.2.log.zip, ...
            -->
            <MinIndex>1</MinIndex>
            <MaxIndex>10</MaxIndex>
        </rollingPolicy>
    </appender>

    <!-- com.juhyun 하위 패키지 -->
    <logger name="com.juhyun"  level="info" additivity="false">
        <appender-ref ref="fileAppender" />
    </logger>

</configuration>

 

위 파일에 대해 주석을 추가했지만, 간략하게 설명드리겠습니다.

<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-> RollingFileAppender 클래스는 FileAppender 클래스를 상속받으며 로그 파일을 롤오버 하능 기능입니다.

%d{HH:mm:ss.SSS}
-> 로그가 출력되는 시간을 기록하는 설정입니다.
 
[%thread]
-> 로그를 출력하는 스레드를 기록합니다.
 
%-5level
-> 로그 레벨을 출력합니다.
-> -5는 5칸을 차지하는 것을 의미합니다.

%logger{5}
-> 로그를 출력할 java 파일명을 나타내며, {5}은 파일명의 포맷팅 형식입니다.
 
%msg%n
-> 메시지와 개행(줄바꿈)을 의미합니다.
  

#예제 코드

package com.workathome;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Logging {
    public static void main(String[] args) {
        log.debug("Logging - Debug log");
        log.info("Logging - Info log");
        log.warn("Logging - Warn log");
        log.error("Logging - Error log");
    }
}


위 코드를 실행해보면 아래와 같이 xml파일에 설정한 경로에 log 파일이 생성되는걸 확인할 수 있습니다.
file에 출력할 로그 레벨을 info로 설정했기 때문에, 하위 레벨인 Debug는 출력이 되지 않습니다.



반응형

'백엔드 (Back-End) > 스프링 (Spring)' 카테고리의 다른 글

<Spring> 백엔드 API 구조  (1) 2022.10.18
<Spring> @Nullable 어노테이션  (0) 2022.09.05
<Spring>REST API 란?  (0) 2022.09.04