根据线程记录到不同的文件

时间:2011-02-27 20:01:43

标签: java logging log4j apache-commons-logging

我有一个带有多个“控制器”的应用程序,我希望每个日志都有自己的文件。这对于他们自己的代码来说很容易,但我也使用了一些使用commons日志记录的库代码。我可以以某种方式获取该代码以登录到控制器特定的文件吗?

我以为我可以通过线程以某种方式做到这一点:

class Controller {

 public void action() {
  setCurrentThreadLogFile(myLogFile);
  try {
   Library.stuff();
  } finally {
   restoreCurrentThreadLogFile();
  }
 }

}

目前我正在使用commons-logging进行自己的日志记录,log4j作为后端。但是如果需要的话,我可以改变它,或者使用混合(这在公共日志框架中是可能的)。

我可以这样做的一种方法是编写我自己的公共日志记录实现(可能是log4j的包装器),但是有现成的解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可能希望查看映射的诊断上下文(MDC)。 Commons日志记录不支持这些,但是Log4J会这样做,所以你必须直接去Log4J进行设置。您可能必须使用MDC滚动自己的过滤器进行过滤并应用于追加器。

如果您愿意更改日志记录实现,那么您可以使用SL4J作为日志记录外观,使用Logback作为日志记录实现。让控制器或某种过滤器/拦截器为您将用于区分控制器的密钥添加一个鉴别器值,使其与MDC区分开来。使用SiftingAppender将日志事件分隔为单独的文件。

答案 1 :(得分:1)

每个线程的记录器?将记录器放在ThreadLocal中。如果您使用java.util.logging,则Handler可以使其对来电者透明。