使用log4j在Java中记录一个线程

使用log4j在Java中记录一个线程,java,multithreading,log4j,Java,Multithreading,Log4j,我有一个用Java编写的web应用程序,还有一个线程池 这个应用程序非常庞大,我无法进行重大更改,例如,我无法更改log4j 我正在线程池中执行一个批处理过程,我想记录为执行该过程而执行的所有操作 线程池中始终只有一个线程处于活动状态 你知道我该怎么做吗?我假设一切都是在你提到的单个线程上执行的,我所说的一切都是指你感兴趣的一切 如果您可以更改log4j配置文件,使其在日志格式字符串中包含线程ID,那么您可以使用工具(例如grep)将日志过滤到该线程。我想您还有其他线程,例如不想记录的请求线程,

我有一个用Java编写的web应用程序,还有一个线程池

这个应用程序非常庞大,我无法进行重大更改,例如,我无法更改log4j

我正在线程池中执行一个批处理过程,我想记录为执行该过程而执行的所有操作

线程池中始终只有一个线程处于活动状态


你知道我该怎么做吗?

我假设一切都是在你提到的单个线程上执行的,我所说的一切都是指你感兴趣的一切


如果您可以更改log4j配置文件,使其在日志格式字符串中包含线程ID,那么您可以使用工具(例如grep)将日志过滤到该线程。

我想您还有其他线程,例如不想记录的请求线程,只想将批处理中的事件记录到专用日志文件中

要按批将所有日志写入日志文件,需要在运行时对log4j配置进行一些运行时调整。在批处理开始时添加这些更改,并在批处理完成后删除这些更改-静态log4j应用程序配置不会更改,运行时log4j配置更改不会影响应用程序的其余部分

以下是您为仅为批次启用日志记录所做的更改:

  • 在批处理开始时,向要从中获取日志的Cataegory/Logger实例添加新的appender。这很可能是记录所有日志的根类别,而不考虑类别
  • 使用当前线程(批处理运行的线程池线程)配置新的appender。appender将此作为其内部筛选的一部分,仅从给定线程写出日志。自定义appender通过简单地将日志委托给常规appender来写入日志,即将日志写出到您想要的任何地方
  • 在批处理结束时,将记录器从类别中删除(或者通过将记录的线程设置为null来禁用appender)

我有自己的附件。这是一个web应用程序,因此,还有其他线程,但我只想记录来自批处理线程的所有内容。我的建议是,您记录所有内容,但在根据批处理进程的线程ID编写日志后,您会过滤日志。当我说“记录所有内容”时,我忘了提到这一点我的意思是在错误和信息模式中有预配置的记录器。我想打印/拥有/处理该记录器的调试消息。我创建了自己的Appender,但它并没有像我预期的那样工作。这个想法似乎很有趣。我试试看。谢谢