Python多进程不要使用TimedRotatingFileHandler

转载 2015年11月17日 17:05:35

在一个多进程的程序中使用TimedRotatingFileHandler, 以自动的切分日志.

运行一段时间后, 发现有大量的日志丢失, 并且程序报下面的异常

Traceback (most recent call last):
  File "/home/work/python27/lib/python2.7/logging/handlers.py", line 77, in emit
    self.doRollover()
  File "/home/work/python27/lib/python2.7/logging/handlers.py", line 347, in doRollover
    os.remove(dfn)
OSError: [Errno 2] No such file or director

程序报异常原因: doRollover()对文件缺失的异常没有处理.

日志丢失原因: 每个进程都会分别rotate, 导致日志丢失.

假设日志的backupCount=3, 按天rotate, 则第一个进程rotate时, 会执行

rm log.3
mv log.2 log.3
mv log.1 log.2
mv log log.1
...

如果进程共用一个日志文件, rotate只需要执行一次, 但实际是每个进程都会执行一次上面的过程, 第一个rotate之外的进程, 在rm的时候删除的都是没有过期的日志.

其实, Python的logging本身对多进程不支持.

Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported, because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, the best way of doing this is to have all the processes log to a SocketHandler, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing processes to perform this function.) The following section documents this approach in more detail and includes a working socket receiver which can be used as a starting point for you to adapt in your own applications.

但是一般而言, 多进程使用同一个日志文件, 也不会造成日志混乱.

如果需要保证多进程的日志安全的输出到同一个日志文件, 则可以:

  • 将日志发送到同一个进程, 由这个进程负责输出.
  • 对日志输出进行加锁, 每个进程输出日志前需要先获得锁, 如ConcurrentLogHandler.

但这样会因为日志使程序复杂, 或影响性能.

回到初始多进程日志切分的问题, 不能使用TimedRotatingFileHandler, 可以用cron配合日志切分脚本实现.

另外需要注意的是, logging不应该用FileHandler, 而应该用WatchedFileHandler.

当日志文件被移动或删除后:

  • FileHandler会继续将日志输出至原有的文件描述符, 从而导致日志切分后日志丢失.
  • WatchedFileHandler会检测文件是否被移动或删除, 如果有, 会新建日志文件, 并输出日志到新建的文件.

相关文章推荐

python的logging库中TimedRotatingFileHandler类问题

原文网址:http://www.5dcode.com/?p=545 第一次用python,第一次用logging,第一次用TimedRotatingFileHandler,居然发现了其中的BUG,记...

怎样从0开始搭建一个测试框架_2——日志

封装logging库,写日志。

python logging现学现用 – TimedRotatingFileHandler使用方法

原文链接: http://openexz.sinaapp.com/2011/10/12/python-logging%e7%8e%b0%e5%ad%a6%e7%8e%b0%e7%94%a8-time...

Python logging 模块

Python logging 模块 给大家剖析下Python的logging模块。 logging模块是Python内置的一个强大易用的日志模块。简单到你只需要两行代码就能输出一些东西来:impo...

TimedRotatingFileHandler

python日志按时间切分-----TimedRotatingFileHandler - [coding] 2011-07-18 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声...

[bigdata-078] python3 logging 的示例 TimedRotatingFileHandler和RotatingFileHandler 基于时间切分和基于文件大小切分

1. 官网文档 https://docs.python.org/3/library/logging.html 2. logger不会直接实例化。而是以logging.getLogger(name)...

python日志输出—logging直接代码配置

一、logging直接写在代码中 #!/usr/bin/python #coding=utf-8 #Define log operation #Naiveloafer #2012-06-04 ...

python中用logging实现日志滚动和过期日志删除

之前听说python的logging库很好用,自带滚动和过期删除的功能,今天捣鼓了一下,并将自己捣鼓的过程记录下来。

python日志TimedRotatingFileHandler学习

python logging现学现用 – TimedRotatingFileHandler使用方法 TimedRotatingFileHandler这个模块是满足文件名按时间自动更换的需求,...

Python 多进程日志记录

刚开始用 Python 做 web 开发的时候我就想一个问题,如果 Python 应用需要自己记录一些比 accesslog 更详细的日志(使用 Python 的 logging module),又有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)