zlog日志打印时间有些乱序
您好!
zlog会出现下面的情况:时间上好像有些乱序,请问是什么原因? 是否是因为小弟没有设置相关参数:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
您好!
zlog会出现下面的情况:时间上好像有些乱序,请问是什么原因? 是否是因为小弟没有设置相关参数:
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(12)
回头来说其实可以不用锁,用一个无锁的消息队列来搞就可以了。。。
ACE里的日志打印基本没有时间乱序问题。可以参考一下他。
要么是它太慢了,以至于无法观察到这种现象。。 要么是它每次写日志都要加全局的进程锁,这也同样会导致慢。 zlog也不会每次都出现这种情况的。
个人感觉无需进行排序,在多进程下,这样很正常,若要追踪错误,应该根据PID 进行日志筛选,这样就不会有时间错位了把。
刚才试验了一下log4cplus在多线程下打印无乱序现象,但它是C++实现,不知是否有参考价值
这个问题的解决等价于要排序,多线程先获取时间的先写文件,也就是说有个线程要已经获取了时间,但要等待别的线程写完文件后再写。
任何等待是需要开销的,CPU空转,或其他之类的,要和别的线程通信。
所以从库的角度出发,如果要解决这个问题,必然要牺牲工作线程的性能,用于等待其他线程,而得到的好处是日志排序的细微改进。所以我觉得意义不大,不过你提这个问题还是很好的。
如果为了追求精确性,可以在事后排序,用sort过一遍日志文件。
个人觉得这个问题还是要解决一下,大家一起想一个兼顾速度与开销的方案,把zlog做的更加完善!
如果将取时间与写操作做为原子操作是否可以解决此问题
原子就要锁,要锁就意味着A线程什么时候写日志要等待B线程,如果B线程卡住了,那么A线程也一起卡住。。。
这是有可能的,因为在写一次日志的过程中,取时间是其中一步
......
get_time
write_file
......
如果AB两个线程在时间上是这么执行的话
A get_time
B get_time
B write_file
A write_file
于是后面的时间就会比前面的时间先打印。
如果要严格规避这个问题,目前我想到的办法有
需要让每条写日志的语句都是原子性的,在一个进程内,代价太大。
或者可以把多个线程的日志分开来写,可以保证不乱序。
是在多线程情况下出现的此问题,时间乱序毕竟对问题定位不利
估计是多线程