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

标签 c++ logging log4cxx

我在我的项目中使用了 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首先,乍一看,这可能符合您的需求,但我没有深入挖掘......如果 native 不支持,您可能会用一些自定义的线程包装非线程安全的 FileAppender您自己的安全 Appender 类。

如果你想从多个进程写入一个文件,你也需要在不同的进程之间进行同步。对 的支持完全取决于操作系统,但并不是所有的都为您提供适当的支持。

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

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

关于c++ - 两个日志行与 c++ 中的 log4Cxx 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690952/

相关文章:

c++ - Log4Cxx sql server appender

c++ - 链接到正确的库

c++ - 为什么STL中List的迭代器使用的是(*node).data而不是node->data?

c++ - 如何将 enable_if 用于互斥的非成员函数模板?

php - 如何使用 Yii 框架记录所有对站点的 HTTP 请求?

python - 通过MinGW在Windows上安装apr,未检测到Python

c++ - 哪个编译器最适合刚开始学习 C++ 的人?

logging - Liferay 日志级别

java - 多个记录器可以使用相同的处理程序吗?

linux - 在 Linux 上链接 Log4cxx 的静态构建无法找到符号