python多进程 写日志问题

在使用 TimedRotatingFileHandler python日志切分的时候,遇到错误:

 os.rename(source, dest)
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问

代码是单进程的,最初遇到这个错误比较疑惑,最后发现是在代码中

import django
django.setup()

引用了django,因此同时有一个django进程存在。

解决方法

这样修改后,最终实现效果与之前有所不同,不会有类似logger.log这样的命名格式,所有的log文件名都加上了时间戳,可以通过suffix控制切割的频率。

 
class SafeFileHandler(FileHandler):
    def __init__(self, filename, mode="a", encoding=None, delay=0, suffix="%Y-%m-%d_%H"):
        if codecs is None:
            encoding = None
        current_time = time.strftime(suffix, time.localtime())
        FileHandler.__init__(self, filename + "." + current_time, mode, encoding, delay)
 
        self.filename = os.fspath(filename)
 
        self.mode = mode
        self.encoding = encoding
        self.suffix = suffix
        self.suffix_time = current_time
 
    def emit(self, record):
        try:
            if self.check_base_filename():
                self.build_base_filename()
            FileHandler.emit(self, record)
        except(KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)
 
    def check_base_filename(self):
        time_tuple = time.localtime()
 
        if self.suffix_time != time.strftime(self.suffix, time_tuple) or not os.path.exists(
                os.path.abspath(self.filename) + '.' + self.suffix_time):
            return 1
        else:
            return 0
 
    def build_base_filename(self):
        if self.stream:
            self.stream.close()
            self.stream = None
 
        # if self.suffix_time != "":
        #     index = self.baseFilename.find("." + self.suffix_time)
        #     if index == -1:
        #         index = self.baseFilename.rfind(".")
        #     self.baseFilename = self.baseFilename[:index]
 
        current_time_tuple = time.localtime()
        self.suffix_time = time.strftime(self.suffix, current_time_tuple)
        self.baseFilename = os.path.abspath(self.filename) + "." + self.suffix_time
 
        if not self.delay:
            self.stream = open(self.baseFilename, self.mode, encoding=self.encoding)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值