Log4j는 Java 어플리케이션에서 로그를 처리하는데 널리 사용되는 라이브러리입니다. MDC(Mapped Diagnostic Context)는 Log4j에서 제공하는 기능으로, 로그 이벤트에 특정 컨텍스트 정보를 추가하여 관리할 수 있게 해줍니다. 이러한 MDC 기능을 활용하면 로그를 추적하고 문제를 분석하는데 도움을 줄 수 있습니다.
MDC란 무엇인가요?
MDC는 로깅 코드에서 로그 이벤트에 추가 정보를 제공하기 위해 사용되는 기능입니다. MDC는 스레드별로 독립적으로 관리되는 맵으로, 로그 이벤트에 해당 맵을 추가하여 로그 메세지에 관련 정보를 첨부할 수 있습니다. 이러한 맵은 스레드별로 별도의 저장 공간을 가지며, 스레드가 종료되면 자동으로 초기화됩니다.
MDC를 사용하는 방법
-
Log4j의 MDC 클래스를 import 합니다.
import org.apache.log4j.MDC;
-
코드의 적절한 위치에 MDC 정보를 추가합니다.
MDC.put("username", "john_smith"); MDC.put("ip_address", "192.168.0.1");
해당 정보는 로그 이벤트에 함께 기록되어 로그를 분석할 때 유용한 추가 정보로 활용될 수 있습니다.
-
로그를 기록하는 부분에서 MDC 정보를 활용합니다.
logger.info("User logged in successfully");
위의 예시에서는 로그 이벤트에 “User logged in successfully”라는 메세지가 추가로 기록되며, MDC에 저장된 정보도 함께 기록됩니다. 따라서 로그를 분석할 때, 해당 이벤트가 어떤 사용자와 어떤 IP 주소에서 발생했는지 확인하기 쉽게 됩니다.
-
MDC 맵에 저장된 정보를 제거합니다.
MDC.remove("username"); MDC.remove("ip_address");
MDC에서 제거하지 않으면 정보가 계속 유지되므로, 필요하지 않은 정보는 꼭 제거해주어야 합니다.
MDC 활용 시 주의할 점
- MDC는 스레드별로 관리되기 때문에, 스레드 풀 등에서 사용할 경우 스레드를 재사용하는 동안 이전에 저장된 정보가 그대로 남을 수 있습니다. 이를 방지하기 위해 스레드 풀에서 스레드 재사용을 할 때 MDC 정보를 초기화해주어야 합니다.
- MDC에 저장되는 정보는 메모리를 사용하므로, 너무 많은 정보를 저장하거나 사용하지 않는 정보를 계속 유지하는 것은 리소스 낭비가 될 수 있습니다.
결론
Log4j의 MDC 기능은 로그 이벤트에 추가 정보를 제공하여 로그를 분석하는데 도움을 줄 수 있는 기능입니다. MDC를 활용하여 로그 이벤트에 특정 컨텍스트 정보를 첨부함으로써, 문제 해결과 로그 분석을 보다 쉽고 효율적으로 할 수 있습니다.