在 c++ 中,两个日志行与 log4Cxx 混合在一起



我已经在我的项目中使用了log4cxx用于日志记录目的。但是,最近我注意到一些不同的日志行相互混合。我不确定问题出在哪里。例如,我期待如下所示的日志行,

打印测试线一

打印测试线二

打印测试线三

但是,日志写得如下,

打印测试 打印测试线二

第一行

打印测试线一

注意:我已经在我的应用程序中使用了多线程和多进程。

如果有人为此提供正确的解决方案,那就太好了。

提前谢谢。

我已经尝试过使用 setBufferSize 和 setImmediateFlush 选项与 log4cxx。但是,不工作。

我已经在我的应用程序中使用了多线程和多进程。

这就是问题所在。显然 log4cxx 不是线程安全的,至少不是您当前正在使用的设施。然后发生的情况是一个线程开始写入日志消息,被另一个线程打断,另一个线程再次开始写入消息,将其放在已经开始但尚未完成的第一个线程中。

您可以解决此问题,例如,通过为每个线程提供单独的日志文件。不确定log4cxx本机支持的程度(我不太熟悉它(,但是,像线程本地FileAppender之类的东西可能会解决问题。

否则,您需要以某种方式保护log4cxx写入文件的点免受竞争条件的影响。请先评估 NDC,乍一看,这可能适合您的需求,尽管我没有深入挖掘......如果本机不受支持,则可以使用自己的一些自定义线程安全追加器类包装非线程安全FileAppender

如果要从多个进程写入单个文件,则还需要跨不同进程进行同步。对 的支持完全依赖于操作系统,但并非所有支持都为您提供适当的支持。

如果记录到数据库是一种选择,ODBCFileAppender看起来也很有趣。我假设(但您需要自己验证(每条日志消息都会产生自己的SQL查询,因此写入同步将留给DBMS。这不仅适用于线程,也适用于进程。

最后:您可以编写自己的日志记录服务器,接受来自不同线程的连接(例如管道或套接字(。它将缓冲每个连接的传入日志消息,并将它们一个接一个地写入文件。这在不同的线程中也是安全的,类似于数据库解决方案。

最新更新