用于登录多线程环境的最佳方法和最佳工具是什么,以便每个线程都拥有自己的记录器实例和单独的文件。这有可能吗?
答案 0 :(得分:6)
您可以尝试使用自定义Log4J appender,它将线程ID作为参数,并根据线程调用它来过滤消息。即时创建它,将其附加到记录器。
这种方法存在多个问题:
我建议您考虑一种更简单的方法:将线程ID记录到同一个日志文件中。它快速而简单,log4j有一个%标志。稍后,如果需要,您可以按线程ID grep /拆分日志文件。
<强>更新强>:
实际上,您可能只有一个自定义appender,它会在新线程记录记录时按需打开日志文件(appender在该线程上下文中执行,只需调用Thread.currentThread()。getName())。但是您必须重新实现所有常规日志文件任务(轮换)或将其委托给每个文件的标准appender。
答案 1 :(得分:4)
我有一个多线程应用程序,用于标识日志文件中的每个线程(关于mutliple文件的dunno,单个文件显示我的可靠性),标识线程是由日志记录框架自动完成的,它是Log4J
编辑:在代码中不需要添加任何内容,只需在记录器中配置appender以包含[%Thread],它将标识您从中记录当前消息的线程,这是例子来自log4net:
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
以下是其他常见Java logging frameworks
的列表答案 2 :(得分:1)
在某些情况下,了解线程标识符远不如知道执行上下文重要。对于许多线程和更大的应用程序来说尤其如此。当线程ID发生变化时你会怎么做,但实际的执行上下文实际上是相同的(就像有人提到的线程池一样)?我宁愿使用MDC (mapped diagnostic context)来跟踪日志中的执行上下文。它更好,因为你可以控制上下文。最后,您可以设置日志布局以包含MDC,然后轻松过滤掉相关内容。查看this tool,它在MDC中做了很多事情。