
Java 진영에서 로깅 라이브러리를 선택할 때, Log4j 보다는 Log4j, Logback 을 사용해야합니다.
왜 그럴까요?
Log4j는 오래도록 Java 진영에서 널리 사용된 로깅 라이브러리였지만, 성능 면에서 몇 가지 아쉬운 점이 있었습니다. 그 구체적인 문제점들을 하나씩 보도록 하겠습니다.
Log4j의 동기적 로깅은 로그를 기록할 때마다 기다려야 하므로 성능에 영향을 미칩니다.
이 부분을 코드 예시로 보면 다음과 같습니다.
import org.apache.log4j.Logger;
public class Log4jExample {
// Log4j Logger 객체 생성
static final Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) {
for (int i = 0; i < 100000; i++) {
// 매번 로그를 기록할 때마다 기다리므로 성능 저하
logger.info("This is an info message: " + i);
}
}
}
문제점
Log4j의 기본 설정은 파일 I/O를 동기적으로 처리합니다. 로그를 디스크에 기록하는 과정에서 I/O가 블로킹되기 때문에 성능 저하를 일으킵니다.
<!-- log4j.xml 설정 예시 -->
<configuration>
<appender name="file" class="org.apache.log4j.FileAppender">
<param name="File" value="app.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="file"/>
</root>
</configuration>
문제점
Log4j에서는 로그 메시지를 기록할 때마다 포맷을 처리합니다. 이 포맷팅 작업은 특히 DEBUG나 TRACE 레벨에서 자주 발생하는 경우 성능을 저하시킬 수 있습니다.
import org.apache.log4j.Logger;
public class Log4jFormatExample {
static final Logger logger = Logger.getLogger(Log4jFormatExample.class);
public static void main(String[] args) {
// DEBUG 레벨 로그는 포맷팅 작업을 매번 수행
for (int i = 0; i < 100000; i++) {
logger.debug("User " + i + " has logged in.");
}
}
}
문제점
멀티스레딩 환경에서 여러 스레드가 동시에 로그를 기록할 때, 동기화가 필요하기 때문에 성능이 떨어질 수 있습니다. Log4j는 기본적으로 동기화된 로깅을 제공하는데, 이로 인해 스레드 간 경쟁이 발생할 수 있습니다.
다음 멀티스레드 환경에서의 성능 저하를 일으키는 코드를 보겠습니다.
import org.apache.log4j.Logger;
public class Log4jMultithreadingExample {
static final Logger logger = Logger.getLogger(Log4jMultithreadingExample.class);
public static void main(String[] args) {
// 멀티스레드 환경에서 동시에 로그를 기록하는 예시
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
logger.info("Thread " + Thread.currentThread().getName() + " - Log " + i);
}
};
// 5개의 스레드에서 동시에 로그를 기록
for (int i = 0; i < 5; i++) {
new Thread(task).start();
}
}
}
문제점
우리는 Log4j 를 대신하여 로깅처리를 할 수 있도록 다음과 같은 대안을 생각해볼 수 있습니다.
![]() | ![]() |
|---|
다음 포스팅을 통해서 Log4j 보다 더 나아진 방식들에 대해 알아보도록 하겠습니다.
Logback 이 Log4j 보다 나아진 점
Logback 을 활용하여 log 남기기