在java中登录多线程应用程序

mab*_*zer 8 java logging multithreading

在多线程环境中登录的最佳方法和最佳工具是什么,这样每个线程都有自己的记录器实例和单独的文件.这有可能吗?

Vla*_*hev 6

您可以尝试使用自定义Log4J appender,它将线程id作为参数,并根据线程调用它来过滤消息.即时创建它,将其附加到记录器.

但是这种方法存在多个问题:

  1. 太多的appender会减慢日志记录
  2. AppServer通常有一个线程池.这意味着随着时间的推移,相同的线程将参与执行完全不相关的请求,这些请求将最终出现在同一个日志文件中.

我建议你考虑一种更简单的方法:将线程id记录到同一个日志文件中.它快速而简单,log4j有一个%标志.稍后,如果需要,您可以按线程ID grep /拆分日志文件.

更新:

实际上,您可能只有一个自定义appender,它会在新线程记录记录时按需打开日志文件(appender在该线程上下文中执行,只需调用Thread.currentThread().getName()).但是您必须重新实现所有常规日志文件任务(轮换)或将其委托给每个文件的标准appender.