在java中登录multithreading应用程序

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

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

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

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

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

更新

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

我有一个multithreading应用程序,可以识别日志文件中的每个线程(关于mutliple文件的dunno,单个文件显示我的可靠性),识别线程是由日志框架自动完成的,它是Log4J

编辑:在代码中不需要添加任何内容,只需在记录器中配置appender以包含[%Thread],它将标识从中记录当前消息的线程,这个示例来自log4net:

    

以下是其他常见Java日志框架的列表

在某些情况下,了解线程标识符远不如知道执行上下文重要。 对于许multithreading和更大的应用程序来说尤其如此。 当线程ID发生变化时你会怎么做,但实际的执行上下文实际上是相同的(就像有人提到的线程池一样)? 我宁愿使用MDC (映射的诊断上下文)来跟踪日志中的执行上下文。 它更好,因为你可以控制上下文。 最后,您可以设置日志的布局以包含MDC,然后轻松过滤掉相关的内容。 看看这个工具 ,MDC做了很多事情。