博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python多进程不要使用TimedRotatingFileHandler
阅读量:2436 次
发布时间:2019-05-10

本文共 1861 字,大约阅读时间需要 6 分钟。

引用地址:

在一个多进程的程序中使用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.3mv log.2 log.3mv log.1 log.2mv 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.

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

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

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

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

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

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

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

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

转载地址:http://bslmb.baihongyu.com/

你可能感兴趣的文章
Mybatis光速入门(配置文件模块)
查看>>
关于Oracle的主键自增如何设置
查看>>
手撕HashMap的resize()方法源码渗透解析+图解
查看>>
Mybatis常见异常类型Could not set parameters for mapping离不开这个原因!
查看>>
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>
JAVA如何实现短信验证码--阿里云接口,新手式图文教学,个人项目有这一篇就够了
查看>>
Java中大小数BigDecimal的加减乘除用法及场景的详细介绍,看完不信你还会报Syntax error on token “+/-/*“, invalid AssignmentOperat异常
查看>>
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>
cf404b
查看>>
cf404c
查看>>
cf404d
查看>>
武大网络预赛 Problem 1545 - I - Twenty-four
查看>>
ZOJ Problem Set - 3768 Continuous Login
查看>>
某山面试 3、实现如下函数:
查看>>
malloc的小知识
查看>>
UVALive 6755 - Swyper Keyboard
查看>>
uva_11029 Leading and Trailing 快速幂 数的n次方前几位
查看>>
uva10023 手算开方的方法
查看>>