log4cpp有时会停止正常工作

问题描述

我在多进程环境中有一个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,后者又将定向到另一个日志文件

解决方法

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

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