Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ log4cpp在一段时间后停止正常工作_C++_Log4cpp - Fatal编程技术网

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

C++ log4cpp在一段时间后停止正常工作,c++,log4cpp,C++,Log4cpp,我在多进程环境中实现了log4cpp。记录器在初始化期间配置一次,然后在服务器http请求的分叉进程之间共享 在第一分钟左右的时间里,我看到日志在每秒的查询负载下运行得非常好(假设它以100qps的速度运行)。 之后,日志速度急剧下降。因此,我也记录了pid,并注意到只有一个进程在一段时间内(大约10-15秒)写入日志,然后另一个进程开始写入,以此类推。进程不会消亡。他们就是没有机会写作 这与服务器启动时发生的情况不同。此时,每隔一行日志都由不同的进程写入。(另外,我在服务请求结束时为每个进程写

我在多进程环境中实现了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为您提供的时间

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

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


另外,

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


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

使用
strace
检查子进程。他们在做什么而不是向文件中写入?strace没有透露任何异常情况,也没有透露写入文件和未写入文件之间的区别。我认为记录器引用与新进程的创建不符。