Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据线程记录到不同的文件_Java_Logging_Log4j_Apache Commons Logging - Fatal编程技术网

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

Java 根据线程记录到不同的文件,java,logging,log4j,apache-commons-logging,Java,Logging,Log4j,Apache Commons Logging,我有一个具有多个“控制器”的应用程序,我希望每个日志都有自己的文件。这对于他们自己的代码来说很容易,但我也使用了一些使用commons日志的库代码。我是否可以将代码也记录到控制器特定的文件中 我在想我可以通过线程来完成它: class Controller { public void action() { setCurrentThreadLogFile(myLogFile); try { Library.stuff(); } finally { restoreCurr

我有一个具有多个“控制器”的应用程序,我希望每个日志都有自己的文件。这对于他们自己的代码来说很容易,但我也使用了一些使用commons日志的库代码。我是否可以将代码也记录到控制器特定的文件中

我在想我可以通过线程来完成它:

class Controller {

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

}
目前,我也在使用commons日志作为自己的日志,以log4j作为后端。但如果需要,我可以改变这一点,或者使用混合(在commons日志框架中是可能的)


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

每个线程一个日志记录器?将记录器置于
线程本地
中。如果您使用的是
java.util.logging
,则
处理程序可以使调用方透明。

您可能希望查看映射的诊断上下文(MDC)。Commons日志不支持这些,但Log4J支持,所以您必须直接转到Log4J来设置。您可能需要使用MDC滚动您自己的过滤器进行过滤,并应用于Appender


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

面向方面编程是否适合您?我认为这可以很好地解决您的问题。如果我必须编写自己的实现,ThreadLocal确实是一个工具。我不使用java.util.logging,但是,我无法在Tomcat中正确配置它。我可能会将自己的库类型代码更改为使用SLF4J,但是不在我控制下的使用commons logging的代码呢?SLF4J支持遗留API。它提供了一个使用其API实现的commons日志的实现。您只需要将commons日志jar替换为jcl-over-slf4j.jar。看,我不清楚。我知道SLF4J有一个commons日志适配器,但它是否适用于MDC?我的意思是,如果我在上下文中使用库代码,那么日志输出最终会出现在正确的文件中吗?(我不需要从库代码中编辑MDC)。它是一个存储在本地线程上的映射,所以我希望它能正常工作。我已经实现了它。工作完美,安装起来很轻松。唯一笨拙的事情是必须围绕所有内容编写MDC设置包装器代码。