两个日志行与 c++ 中的 log4Cxx 混合

Two log lines are mixed with log4Cxx in c++

我在我的项目中使用了 log4cxx 来记录日志。但是,最近我注意到一些两个不同的日志行相互混合。我不确定是什么问题。例如,我期待像下面这样的日志行,

Printing the test line one

Printing the test line two

Printing the test line three

但是,日志是这样写的,

Printing the test Printing the test line two

line one

Printing the test line one

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

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

提前致谢。

我已经在 log4cxx 中尝试使用 setBufferSize 和 setImmediateFlush 选项。但是,不起作用。

I have used the multi-thread and multi-process with my application.

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

你可以解决问题e。 G。通过为每个线程设置单独的日志文件。不确定 log4cxx 原生支持的程度(我不太熟悉它),不过像线程本地 FileAppender 这样的东西可能会起作用。

否则,您将需要以某种方式保护 log4cxx 正在写入文件的点免受竞争条件的影响。请先评估 NDC,乍一看,这可能符合您的需求,但我没有深入挖掘...如果本机不支持,您可以将非线程安全的 FileAppender 包装成一些您自己的自定义、线程安全的 Appender class。

如果你想从多个进程写入一个文件,你也需要在不同的进程之间进行同步。支持完全依赖于OS,但并不是所有的都给你适当的支持。

如果可以选择登录数据库,ODBCFileAppender 似乎也很有趣。我会假设(但你需要自己验证)每条日志消息都会产生它自己的 SQL 查询,因此写入同步将留给 DBMS。这不仅适用于线程,也适用于进程。

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