Java slf4j在每个记录的事件中注入固定参数的最佳方法

时间:2015-01-26 13:09:05

标签: java logging log4j slf4j

我在java中使用slf4j + log4j将日志记录添加到我的Web应用程序中。在每个记录的事件中,我想打印用户正在执行的功能以及用户操作的标识符。

当我的webapp捕获用户的请求时,我会生成标识符,并且我可以访问该功能" name"。将这两个参数放在记录的每个事件中的最佳方法是什么,而不将其传递给每个方法日志。(info | warn | debug | error)?

我知道我可以使用MDC上下文使整个线程的参数可见,并将它们打印在logging语句的格式化程序中。

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

但我想要一个更有控制的解决方案。请注意,在上面的示例中,功能和actionId不会通过日志消息打印,但这不是必需的。

1 个答案:

答案 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
}