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会检测文件是否被移动或删除, 如果有, 会新建日志文件, 并输出日志到新建的文件.

TimedRotatingFileHandler

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

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日志TimedRotatingFileHandler学习

python logging现学现用 – TimedRotatingFileHandler使用方法 TimedRotatingFileHandler这个模块是满足文件名按时间自动更换的需求,...
  • t163ang
  • t163ang
  • 2014年08月11日 17:11
  • 4259

Python 模块之Logging(四)——常用handlers的使用

一、StreamHandler流handler——包含在logging模块中的三个handler之一。能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能...

python的logging库中TimedRotatingFileHandler类问题

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

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

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

Django 日志模块 logging 的配置

本文将通过一个实际的例子来说明如何配置 logging 模块。更多信息可以参考 Django 的官网文档。...

django日志配置

#logging日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': {...

在django中使用logging模块

参考官方文档:https://docs.djangoproject.com/en/dev/topics/logging/ logging是Python 2.3起自带的标准模块,可以用来从运行状态的程...

Django基础+优化

https://docs.djangoproject.com/en/1.4/ Django系统搭建 一. 建立一个pydjango的项目    初始的项目包括根目录的manage.py,以及一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python多进程不要使用TimedRotatingFileHandler
举报原因:
原因补充:

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