TimedRotatingFileHandler有一个缺点就是没有办法支持多进程的日志切换,多进程进行日志切换的时候可能会因为重命名而丢失日志数据
原因在于它的日志并不是直接写在 baseFilename.2022-02-02.log 上,而是先写到 baseFilename上,到了凌晨零点时,把baseFilename 改名为 baseFilename.2022-02-02.log 。然后新建一个baseFilename文件 。
(如果改名时baseFilename.2022-02-02.log已存在,则把原baseFilename.2022-02-02.log删除,再把baseFilename 改名为 baseFilename.2022-02-02.log)
dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)
if os.path.exists(dfn):
os.remove(dfn)
if os.path.exists(self.baseFilename):
os.rename(self.baseFilename, dfn)
如果要解决多进程重复删除baseFilename.2022-02-02.log的问题,比较容易想到的两个思路:
方案一:日志一开始就直接写在baseFilename.2022-02-02.log上
方案二:改名时如果baseFilename.2022-02-02.log已存在,则认为其他进程已做了切换操作,当前进程不需重复操作。
其他方案参考:https://blog.youkuaiyun.com/ling620/article/details/103862183
# 代码转自:https://blog.youkuaiyun.com/dustless927/article/details/122061953
# 另有简易版(无删除过期日志功能) https://my.oschina.net/lionets/blog/796438
import codecs
import os
import re
import sys
import logging
import time
from pathlib import Path
from logging.handlers import BaseRotatingHandler
class DailyRotatingFileHandler(BaseRotatingHandler):
"""
同`logging.TimedRotatingFileHandler`类似,不过这个handler:
- 可以支持多进程
- 只支持自然日分割
- 暂不支持UTC
"""
def __init__(self, filename

本文探讨了`TimedRotatingFileHandler`在多进程环境下可能丢失日志数据的问题,并提供了两种解决方案:一是直接写入完整文件名,二是使用锁机制避免重复切换。通过实例代码展示了如何改进日志切换,确保数据一致性。
最低0.47元/天 解锁文章
5777

被折叠的 条评论
为什么被折叠?



