5

我有一个带有多个“控制器”的应用程序,我希望将每个日志记录到自己的文件中。这对于他们自己的代码来说很容易,但我也在使用一些使用公共日志记录的库代码。我能否以某种方式让该代码也记录到特定于控制器的文件中?

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

class Controller {

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

}

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

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

4

2 回答 2

2

您可能希望查看映射的诊断上下文 (MDC)。Commons logging 不支持这些,但 Log4J 支持,因此您必须直接转到 Log4J 进行设置。您可能必须滚动自己的过滤器才能使用 MDC 进行过滤并应用于附加程序。

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

于 2011-02-27T20:47:14.380 回答
1

每个线程一个记录器?将记录器放在一个ThreadLocal. 如果您正在使用java.util.logging,则 aHandler可以使调用者对此透明。

于 2011-02-27T20:16:00.937 回答