我运行一个部署在 Tomcat 中的 Java webapp。我们commons-logging
用作包装器log4j v1.2.16
我们有许多并发请求访问服务器,并且不希望调试/跟踪记录每个请求。但是,对于某些用户,出于调试原因,我们希望跟踪他们的交易。我们维护一个列表,从数据库驱动,其中用户要跟踪。当请求命中时,我们检查我们的列表以查看是否应该跟踪。
他们在 GET 字符串中传递他们的用户名,我们可以毫无问题地得到它,将其添加到 中MDC
,然后通过ConversionPattern
.
我们现在希望为我们跟踪的每个用户创建一个文件,我对此的解决方案是创建一个RollingFileAppender
所有日志记录都指向的自定义扩展。
如果日志级别是trace
我们检查MDC.get("traceOn")
是否应该输出。
然后我执行以下操作(肮脏的示例):
String file = "/var/log/tomcat6/application/trace/"+MDC.get("username")+".log";
this.setFile(file);
this.activateOptions();
super.doAppend(event);
我知道 MDC 是基于每个线程的,但是在生产中运行它是否安全,有 10 个并发线程日志记录并可能写入它们自己的文件?
如果不是 - 我怎么能实现同样的事情 - 基于 MDC 写入多个日志文件(我们是否应该记录,如果是,则使用文件名)?