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

时间:2010-06-24 10:35:43

标签: java multithreading logging

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

3 个答案:

答案 0 :(得分:6)

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

这种方法存在多个问题:

  1. 太多的appender会减慢日志记录
  2. AppServer通常有一个线程池。这意味着随着时间的推移,同一个线程将参与执行完全不相关的请求,这些请求将最终出现在同一个日志文件中。
  3. 我建议您考虑一种更简单的方法:将线程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中做了很多事情。