重写TimedRotatingFileHandler 以兼容多进程

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值