2015-01-26 1 views
0

java에서 slf4j + log4j를 사용하여 웹 응용 프로그램에 로깅을 추가하고 있습니다. 기록 된 각 이벤트에서 사용자가 실행중인 기능과 사용자 작업의 식별자를 인쇄하려고합니다.자바 slf4j 모든 기록 된 이벤트에 고정 매개 변수를 삽입하는 가장 좋은 방법

웹 응용 프로그램이 사용자의 요청을 받으면 식별자를 생성하고 "이름"기능에 대한 액세스 권한을 갖습니다. 모든 메소드 로그에 전달하지 않고 기록 된 모든 이벤트에이 두 매개 변수를 넣는 가장 좋은 방법은 무엇입니까 (info | warn | debug | error)?

MDC 컨텍스트를 사용하여 매개 변수를 전체 스레드에 대해 표시하고 로깅 문의 포맷터로 인쇄 할 수 있음을 알고 있습니다.

log4j.appender.AppLog.layout.ConversionPattern = %d{ddMMyyyyHHmmss}|%X{feature}|%-5p|%t|%l|%X{actionId}|%m%n 

그러나 나는 더 통제 된 솔루션을 원했습니다. 위의 예에서 기능 및 actionId는 로깅 메시지를 통해 인쇄되지 않지만 필수 사항은 아닙니다.

+0

당신이 항상 자신의 포매터를 쓸 수 있습니다 가정합니다. –

+0

사용자 정의 포맷터를 작성할 수는 있지만 기능 이름과 actionID를 사용할 수있는 솔루션을 찾지 못했습니다. 이들은 동일한 기능의 사용자 작업/요청에 의해 고정 된 매개 변수입니다. 전역 상수가 아닙니다. –

+0

현재 요청 세션에서이 두 매개 변수 만 사용할 수 있습니다. –

답변

0

나는 같은 것을 할 것입니다 :

public MyClass { 
    Logger log = new InterceptedLogger("com.foo.MyClass"); 

    // ... 

    public void handleUserAction() { 
     log.info("Action detected !"); 
     // ... 
    } 
} 

public InterceptedLogger extends Logger { 
    private static MyFramework myFrameWork = MyFramework.getInstance(); // or use an IoC to inject the instance for you... 

    public InterceptedLogger(String name) { 
     super(name); 
    } 

    public void info(Object message) { 
     if (isInfoEnable()) { 
      super.info(// 
       String.format(// 
        "%s#%s - %s", // this format may be configured externally 
        myFrameWork.getCurrentUser(), // 
        myFrameWork.getCurrentAction(), // 
        message // 
       )); 
     } 
    } 

    // Override other methods as needed 
} 
관련 문제