【问题标题】:logging one thread in Java using log4j使用 log4j 在 Java 中记录一个线程
【发布时间】:2011-03-04 06:01:15
【问题描述】:

我有一个用 Java 编写的 Web 应用程序,并且我有一个线程池。

应用程序很大,我不能做大的改变,例如我不能改变log4j。

我正在线程池中执行一个批处理过程,我想记录执行该过程的所有内容。

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

有什么想法可以做到这一点吗?

【问题讨论】:

  • 我忘了提到,当我说“记录所有内容”时,我的意思是在错误和信息模式下预先配置了记录器。我想打印/拥有/处理调试该记录器的调试消息。我创建了自己的 Appender,但它没有按预期工作。

标签: java multithreading log4j


【解决方案1】:

我假设所有内容都在您提到的单个线程上执行,我的意思是您感兴趣的所有内容。

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

【讨论】:

  • 我有自己的附加程序。这是一个 Web 应用程序,所以还有其他线程,但我只想记录来自批处理线程的所有内容。
  • 我的建议是记录所有内容,但在写入日志后根据批处理的线程 ID 过滤日志。
【解决方案2】:

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

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

这些是您为启用批处理而进行的更改:

  • 在批处理开始时,向要从中捕获日志的类别/记录器实例添加一个新的附加程序。这很可能是记录所有日志的根类别,无论类别如何。
  • 新的附加程序配置了当前线程(批处理正在运行的线程池线程)。 appender 将其用作其内部过滤的一部分,以仅从给定线程中写出日志。自定义附加程序通过简单地委托给常规附加程序来写入日志,该附加程序将日志写入您想要的任何位置。
  • 在批处理结束时,从 Category 中删除记录器(或者通过将记录的线程设置为 null 来禁用 appender。)

【讨论】:

  • 这个想法似乎很有趣。我会试试看。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多