我在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不会通过日志消息打印,但这不是必需的。
答案 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
}