Logback 이 Log4j 보다 나아진 점

Brunch Kim·2024년 12월 27일

logging

목록 보기
2/2
post-thumbnail

Logback은 로깅(logging)을 관리하기 위한 라이브러리로, 자바(Java)와 코틀린(Kotlin)에서 주로 사용됩니다.

등장 시점으로 보자면 Log4j -> Logback -> Log4j2 순서로 등장하였습니다.
참고로 Ceki Gülcü 라는 분이 Log4j, Logback 오픈소스에 모두 기여하였습니다.

Logback은 Log4j에 비해 더 나은 성능을 제공합니다. 그 이유는 여러 가지 내부 최적화 때문인데, 가장 큰 차이는 비동기 로깅 처리와 더 효율적인 메모리 관리입니다. Logback은 성능을 위해 기본적으로 최적화된 방식으로 설계되었습니다.

다음 내용에서 자세히 알아보겠습니다.


Log4j의 한계

Log4j는 자바에서 가장 많이 사용되던 로깅 프레임워크 중 하나였습니다. 하지만 시간이 지나면서 몇 가지 한계가 나타났습니다.
자세한 내용은 Log4j 의 한계 포스팅을 참조해주세요.


비동기 로깅 (Asynchronous Logging)

Logback은 비동기 로깅을 기본적으로 지원하여, 로그를 기록하는 동안 다른 코드 실행에 지장을 주지 않도록 처리할 수 있습니다. 즉, 로그가 기록되는 동안 메인 스레드가 대기하지 않도록 처리하여 성능을 향상시킵니다.

Logback에서 비동기 로깅은 AsyncAppender를 사용하여 쉽게 구현할 수 있습니다. 이는 성능을 극대화하는 방법 중 하나입니다.
아래와 같이 AsyncAppender 를 사용하여 비동기 로깅을 활성화할 수 있습니다.

<configuration>
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="console"/>
    </appender>

    <root level="debug">
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

메모리 및 가비지 컬렉션 최적화

Logback이 메모리 관리와 가비지 컬렉션(GC) 최적화에서 Log4j보다 더 우수한 성능을 보입니다.
그 이유는 간단히 얘기해서 불필요한 객체 생성을 줄여서인데요. 방식은 다음과 같습니다.

  1. StringBuilder 사용
    • Logback은 로그 메시지를 결합할 때 StringBuilder를 사용합니다. StringBuilder는 문자열 결합 시 불필요한 중간 객체 생성을 줄이고, 메모리 사용을 최적화합니다.
    • 예를 들어, 문자열을 여러 번 결합할 때마다 새로운 String 객체를 생성하는 대신, StringBuilder는 문자열을 수정할 수 있는 버퍼를 사용하여 새로운 객체를 덜 생성합니다.
  2. 로그 메시지 필터링
    • Logback은 필터링을 통해 로그 레벨이 낮은 메시지를 조기에 제거할 수 있습니다. 예를 들어, DEBUG 레벨 로그는 INFO 이상의 레벨에서만 출력되므로, DEBUG 레벨 로그를 기록하지 않으면 그에 해당하는 객체 생성을 방지할 수 있습니다.
    • 예를 들어, 로그 레벨이 INFO로 설정되어 있고, DEBUG 로그 메시지가 호출되었을 경우, Logback은 해당 메시지의 로그 객체를 아예 생성하지 않습니다. 반면 Log4j에서는 이러한 로그 객체가 생성되지만, 후속 처리에서 출력되지 않는 방식이었습니다.

참고

profile
브런치 즐기는 여유있는 날

0개의 댓글