当前位置:  开发笔记 > 编程语言 > 正文

从多个线程进行Java日志记录的最佳实践?

如何解决《从多个线程进行Java日志记录的最佳实践?》经验,为你挑选了5个好方法。

我想要一个由管理数据的几个任务生成的诊断日志.这些任务可能在多个线程中.每个任务都需要将一个元素(可能带有子元素)写入日志; 进去快点出去.如果这是一个单任务的情况,我会使用XMLStreamWriter,因为它似乎是简单/功能的最佳匹配,而不必在内存中保存一个膨胀的XML文档.

但这不是一个单任务的情况,我不确定如何最好地确保这是"线程安全",其中"线程安全"在这个应用程序中意味着每个日志元素应该正确和连续地写入日志(一个后另一个,不以任何方式交错).

有什么建议?我有一个模糊的直觉,即要使用的方法是使用一个日志元素队列(每个元素都可以快速生成:我的应用程序忙于执行对性能敏感的实际工作),并且有一个单独的线程来处理日志元素并将它们发送到文件,以便日志记录不会中断生产者.

日志记录不一定必须是XML,但我确实希望它是结构化的和机器可读的.

编辑:我把"threadsafe"放在引号中.Log4j似乎是一个显而易见的选择(对我来说很新但对社区来说很老),为什么重新发明轮子...



1> Dan..:

我想你走错了路.你说"线程安全",但实际上你的意思是"序列化".Threadsafe意味着一个线程不会干扰来自其他线程的数据.大多数情况下,线程问题事先得到解决,你不应该只为了记录而担心它.例如,如果你写:

myVariableSum = 0 + myVariable;
//here comes other thread - Not very likely!
logger.info("Log some INFO; myVariable has value" + myVariable.toString());

您必须确保在执行计算(第一行)时但在调用日志记录方法之前,某些其他线程未更改myVariable.如果发生这种情况,您将记录未用于执行操作的脏值,而是记录由其他某个线程分配的值.这通常是照顾; 例如,本地(方法级别)变量不能被其他线程更改.无论如何,如果您在登录时不得不担心这一点,那么99%的程序已经存在严重的线程问题.
所有主要的日志记录框架本身都是"线程安全的",这意味着它们可以部署在多线程环境中,并且不会在内部显示与上述类似的问题.
使跟踪按顺序出现在日志中实际上通常称为调用的"序列化".序列化日志写入将是任何多线程应用程序的主要性能瓶颈.如果您使用日志框架(如log4j),则所有线程的跟踪将在单个位置或多或少地出现,以便它们发生.但是,一列通常是线程名称,因此您可以通过线程轻松过滤日志数据; 每个线程将按时间顺序记录其数据.看看这个链接:http : //logging.apache.org/log4j/1.2/faq.html#1.7
最后,如果您真正需要序列化日志写入,那么您可以使用某种结构,如java.util. concurrent.BlockingQueue用于路由您的消息.



2> Avi..:

使用日志框架,例如Log4j.


我不认为log4j使日志记录线程安全.通过线程安全,我的意思是对于调度程序的任何排序,打印日志的顺序必须相同.我相信你仍然需要使用同步和锁定来使日志记录成为线程安全的.有人想确认/否认吗?
Log4J绝对是线程安全的,因为即使从不同的线程写入,每条日志消息也将以原子方式写入.我不确定为什么你需要任何其他线程安全感,但你可以在外部同步,正如你所说.
确保使用log4j ConversionPattern中的'%t'表达式来记录线程名称

3> Ceki..:

使用logback-classic.它是log4j的更新更好的实现.



4> jpfollenius..:

您可以使用同步机制(例如监视器或信号灯)来确保在接受下一个日志请求之前已处理了一个日志请求。所有这些都可以从调用日志记录例程的代码中隐藏。



5> Evan..:

我倾向于在Log4J之上使用SLF4J.该参数记录功能是特别有吸引力,如果你将拥有很多可以顺利拿到在生产环境中关闭日志报表.

它也可以运行在java.util.logging的顶部或使用它自己的简单输出.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有