我正在使用 log4cxx::rolling::RollingFileAppender() 来登录我的 C++ 应用程序,没有任何异步附加程序。如果我从主线程调用日志记录,主线程是否会被阻塞,直到日志字符串写入日志文件?此外,我应该如何展示这种行为?
如果我合并异步附加程序,是否可能会破坏日志记录顺序或在多线程场景中引入意外的延迟?我特别担心对日志记录一致性和性能的影响。有人可以深入了解异步日志记录在这些情况下的行为吗?
我在其中一个消息接收线程上遇到了严重的线程延迟,记录器在 1 秒延迟后记录了预期的日志行,如下所示。
2024-04-03 22:55:14,221 [0x00001290] INFO <..>
2024-04-03 22:55:14,221 [0x00001290] INFO <..>
2024-04-03 22:55:14,221 [0x00001290] DEBUG <..>
2024-04-03 22:55:14,221 [0x00001290] INFO <..>
2024-04-03 22:55:14,221 [0x00001290] INFO <..>
2024-04-03 22:55:14,221 [0x00001290] INFO <..>
2024-04-03 22:55:15,237 [0x00004a44] DEBUG <..>
2024-04-03 22:55:14,237 [0x00003c5c] INFO <..>
2024-04-03 22:55:15,237 [0x00000450] DEBUG <..>
2024-04-03 22:55:16,018 [0x00001290] INFO <..>
2024-04-03 22:55:16,018 [0x00000450] DEBUG <..>
2024-04-03 22:55:16,018 [0x00003c5c] INFO <..>
此处日志行“2024-04-03 22:55:14,237 [0x00003c5c]”在“2024-04-03 22:55:15,237 [0x00004a44]”之后记录,时间戳也仅由 log4cxx 获取,因此基于这里关于其他消息处理延迟,我怀疑记录器得到了卡住并阻塞了调用线程。
Log4cxx 性能在最近 2 个版本中得到了改进,版本 1.3.0 显着减少了向附加程序发送事件的开销,版本 1.2.0 降低了向附加程序发送事件时互斥锁争用的频率。
Log4cxx 无法保证日志文件中的条目按照生成日志请求的顺序排列。时间戳指示生成请求的时间(即执行 LOG4CXX_INFO 宏时)。操作系统调度程序可能会在 LoggingEvent 创建和添加到日志文件的系统调用之间挂起线程。
AsyncAppender 在 1.3.0 版本中进行了广泛的检修,以提高从多个线程记录时的吞吐量(请参阅示例基准测试中的时间)