log4cpp 在一段时间后停止正常工作

Posted

技术标签:

【中文标题】log4cpp 在一段时间后停止正常工作【英文标题】:log4cpp stops working properly after sometime 【发布时间】:2020-09-04 05:34:12 【问题描述】:

我在多进程环境中有一个 log4cpp 实现。记录器在初始化期间配置一次,然后在服务器 http 请求的分叉进程之间共享。

在第一分钟左右,我看到日志在每秒负载的查询中运行得非常好(假设它以 100qps 运行)。 之后,日志显着减慢。因此,我也记录了 pid 并注意到只有一个进程在一段时间内(大约 10-15 秒)写入日志,然后另一个进程开始写入,依此类推。进程不会死。他们只是没有机会写作。

这与服务器启动时发生的情况不同。那时,每隔一个日志行由不同的进程写入。 (另外,我在服务请求结束时为每个进程编写一个日志行。)

在这一点上,我想不出可能出了什么问题。 这就是我的 log4cpp conf 文件的样子

log4cpp.rootCategory=DEBUG,rootAppender
log4cpp.appender.rootAppender=org.apache.log4cpp.RollingFileAppender
log4cpp.appender.rootAppender.fileName=/tmp/mylogfile.log
log4cpp.appender.rootAppender.layout=org.apache.log4cpp.PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d|%p|%m%n


log4cpp.category.http.server.main=INFO,MAIN
log4cpp.additivity.http.server.main=false
log4cpp.appender.MAIN=org.apache.log4cpp.RollingFileAppender
log4cpp.appender.MAIN.maxBackupIndex=10
log4cpp.appender.MAIN.maxFileAge=1
log4cpp.appender.MAIN.append=true
log4cpp.appender.MAIN.fileName=/tmp/mylogfile.log
log4cpp.appender.MAIN.layout=org.apache.log4cpp.PatternLayout
log4cpp.appender.MAIN.layout.ConversionPattern=%d|%p|%m%n

编辑:更多更新:感谢@Botje 抽出宝贵时间。

我看到,每当创建一个新的子进程时,只有该进程才能写入日志。这告诉我,其他进程持有的所有引用都变得无效。

我还尝试将附加属性设置为 true。这样,服务器开始正确写入 /tmp/myfile.log,然后在一分钟内切换到写入 /tmp/myfile.log.1。然后一分钟后停止写作。 此时,日志被定向到 stderr,后者又被定向到另一个日志文件。

还有,

【问题讨论】:

strace检查子进程。他们在做什么而不是写入文件? strace 没有发现任何异常,写的和不写的也没有区别。我认为记录器引用随着新进程的创建而变坏。 【参考方案1】:

我确实注意到 log4cpp FileAppender 在写入日志条目之前使用 seek 来确定文件大小。如果文件句柄在进程之间共享,这将导致写入在文件的开头而不是结尾结束。即使你解决了这个问题,你仍然有多个进程认为它们负责日志文件轮换。

我建议你让所有进程都写入一个通用的 udp/tcp/Unix 套接字,并指定一个进程来收集所有日志条目并将其实际写入文件。您不必重新发明***,您可以使用 syslog 协议以及系统 syslog 或在用户空间中运行的副本。

【讨论】:

以上是关于log4cpp 在一段时间后停止正常工作的主要内容,如果未能解决你的问题,请参考以下文章

拟合模型时,内核在一段时间后停止工作

使用解析的 Android 推送在一段时间后停止工作

Log4cpp 编译+引用

GPS跟踪的前台服务在一段时间后停止工作

Twincat ADS 事件驱动的读取在一段时间后停止工作(Java)

按钮声音在一段时间后停止