python logging 日志名称以及切割处理

日志名称自定义

按照日期切割日志:

默认生成的日志文件格式是你的文件名+时间的格式,没有设置时间的话默认设置到了秒(这里是按秒切割)

import logging
from logging.handlers import TimedRotatingFileHandler 
from logging.handlers import RotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob

# timed日志初始化
def timed_init_log(log_path="", log_file_name="log_test"):
    # 创建日志文件文件夹
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    # 设置默认级别
    logging.getLogger('').setLevel(logging.INFO)
    # 设置标准输出显示
    console = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
                                  '%(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    # 设置回滚文件
    log_file_name_ = "{}{}.log".format(log_file_name, "")
    rotating_file = TimedRotatingFileHandler(os.path.join(log_path, log_file_name_), when='S', interval=1, backupCount=3)

    rotating_file.setFormatter(formatter)
    logging.getLogger('').addHandler(rotating_file)

![image.png](https://img-blog.csdnimg.cn/img_convert/e56f788b171488051ea63d95717c4c1a.png#align=left&display=inline&height=66&margin=[object Object]&name=image.png&originHeight=66&originWidth=778&size=13907&status=done&style=none&width=778)

修改日志格式后缀名称:

    def namer(filename):
        dir_name, base_name  = os.path.split(filename)
        base_name = base_name.replace(log_file_name_+'.', log_file_name)
        rotation_filename = os.path.join(dir_name, base_name)
        return rotation_filename

    rotating_file.namer = namer
    rotating_file.suffix = "_%Y-%m-%d_%H-%M-%S.log"

![image.png](https://img-blog.csdnimg.cn/img_convert/b59673f04ae06d5112c66cc4491d0435.png#align=left&display=inline&height=180&margin=[object Object]&name=image.png&originHeight=180&originWidth=780&size=37087&status=done&style=none&width=780)

日志没有起到自动删除的目的
源码:

    def getFilesToDelete(self):
        """
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        """
        dirName, baseName = os.path.split(self.baseFilename)
        fileNames = os.listdir(dirName)
        result = []
        prefix = baseName + "."
        plen = len(prefix)
        for fileName in fileNames:
            if fileName[:plen] == prefix:
                suffix = fileName[plen:]
                if self.extMatch.match(suffix):
                    result.append(os.path.join(dirName, fileName))
        if len(result) < self.backupCount:
            result = []
        else:
            result.sort()
            result = result[:len(result) - self.backupCount]
        return result

这是它的删除逻辑,关键是通过.前面的字段判断是否重复,当有特定的重复数后开始删除。
修改源码:

import logging
from logging.handlers import TimedRotatingFileHandler as OriginTimedRotatingFileHandler
from logging.handlers import RotatingFileHandler as OriginRotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
env = os.environ.get('env') or 'test'
print(env)

class TimedRotatingFileHandler(OriginTimedRotatingFileHandler):
    def getFilesToDelete(self):
        """
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        """
        dirName, baseName = os.path.split(self.baseFilename)
        fileNames = os.listdir(dirName)
        result = []
        prefix = baseName.replace(".log", self.suffix.split("%")[0])
        plen = len(prefix)
        for fileName in fileNames:
            if fileName[:plen] == prefix:
                suffix = fileName[plen:]
                if self.extMatch.match(suffix):
                    result.append(os.path.join(dirName, fileName))
        if len(result) < self.backupCount:
            result = []
        else:
            result.sort()
            result = result[:len(result) - self.backupCount]
        return result

# timed日志初始化
def timed_init_log(log_path="", log_file_name="log_test"):
    # 创建日志文件文件夹
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    # 设置默认级别
    logging.getLogger('').setLevel(logging.INFO)
    # 设置标准输出显示
    console = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
                                  '%(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    # 设置回滚文件
    log_file_name_ = "{}{}.log".format(log_file_name, "")
    rotating_file = TimedRotatingFileHandler(os.path.join(log_path, log_file_name_), when='S', interval=1, backupCount=3)
    def namer(filename):
        dir_name, base_name  = os.path.split(filename)
        base_name = base_name.replace(log_file_name_+'.', log_file_name)
        rotation_filename = os.path.join(dir_name, base_name)
        return rotation_filename

    rotating_file.namer = namer
    rotating_file.suffix = "_%Y-%m-%d_%H-%M-%S.log"

    rotating_file.setFormatter(formatter)
    logging.getLogger('').addHandler(rotating_file)

timed_init_log("./time_logs", "log_{}".format(env))
i = 0
while True:
    logging.info("sdiogbdfnog{}".format(i))
    time.sleep(1)
    i += 1

![image.png](https://img-blog.csdnimg.cn/img_convert/2a1b0590df07a328068921e0a2deee3a.png#align=left&display=inline&height=82&margin=[object Object]&name=image.png&originHeight=82&originWidth=780&size=15845&status=done&style=none&width=780)

按照大小切割日志:

import logging
from logging.handlers import TimedRotatingFileHandler as OriginTimedRotatingFileHandler
from logging.handlers import RotatingFileHandler as OriginRotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
env = os.environ.get('env') or 'test'


class RotatingFileHandler(OriginRotatingFileHandler):
    def doRollover(self):
        """
        Do a rollover, as described in __init__().
        """
        if self.stream:
            self.stream.close()
            self.stream = None

        dirName, baseName = os.path.split(self.baseFilename)
        baseName = baseName.replace(".log", "")
        if self.backupCount > 0:
            for i in range(self.backupCount - 1, 0, -1):
                dfn = self.rotation_filename("%s.%d" % (self.baseFilename, i + 1))

                sfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i)))
                dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i+1)))

                if len(sfn_) > 0:
                    if len(dfn_) >0:
                        os.remove(dfn_[0])
                    os.rename(sfn_[0], dfn)

            dfn = self.rotation_filename(self.baseFilename + ".1")
            dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, 1)))
            if len(dfn_):
                os.remove(dfn_[0])
            self.rotate(self.baseFilename, dfn)

        if not self.delay:
            self.stream = self._open()


# rota日志初始化
def rota_init_log(log_path="", log_file_name="log_test"):
    # 创建日志文件文件夹
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    # 设置默认级别
    logging.getLogger('').setLevel(logging.INFO)
    # 设置标准输出显示
    console = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
                                  '%(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    # 设置回滚文件
    log_file_name_ = "{}{}.log".format(log_file_name, "")

    rotating_file = RotatingFileHandler(os.path.join(log_path, log_file_name_),  maxBytes=20*1024*1024, backupCount=3)

    rotating_file.setFormatter(formatter)
    logging.getLogger('').addHandler(rotating_file)



rota_init_log("./rota_logs", "log_{}".format(env))
i = 0
while True:
    logging.info("sdiogbdfnog{}".format(i))
    time.sleep(1)
    i += 1


![image.png](https://img-blog.csdnimg.cn/img_convert/ac5357ac49c72dbac0689e4da1b0f076.png#align=left&display=inline&height=72&margin=[object Object]&name=image.png&originHeight=72&originWidth=780&size=15073&status=done&style=none&width=780)

  • 汇总:
import logging
from logging.handlers import TimedRotatingFileHandler as OriginTimedRotatingFileHandler
from logging.handlers import RotatingFileHandler as OriginRotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
env = os.environ.get('env') or 'test'


class TimedRotatingFileHandler(OriginTimedRotatingFileHandler):
    def getFilesToDelete(self):
        """
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        """
        dirName, baseName = os.path.split(self.baseFilename)
        fileNames = os.listdir(dirName)
        result = []
        prefix = baseName.replace(".log", self.suffix.split("%")[0])
        plen = len(prefix)
        for fileName in fileNames:
            if fileName[:plen] == prefix:
                suffix = fileName[plen:]
                if self.extMatch.match(suffix):
                    result.append(os.path.join(dirName, fileName))
        if len(result) < self.backupCount:
            result = []
        else:
            result.sort()
            result = result[:len(result) - self.backupCount]
        return result


class RotatingFileHandler(OriginRotatingFileHandler):
    def doRollover(self):
        """
        Do a rollover, as described in __init__().
        """
        if self.stream:
            self.stream.close()
            self.stream = None

        dirName, baseName = os.path.split(self.baseFilename)
        baseName = baseName.replace(".log", "")
        if self.backupCount > 0:
            for i in range(self.backupCount - 1, 0, -1):
                dfn = self.rotation_filename("%s.%d" % (self.baseFilename, i + 1))

                sfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i)))
                dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i+1)))

                if len(sfn_) > 0:
                    if len(dfn_) >0:
                        os.remove(dfn_[0])
                    os.rename(sfn_[0], dfn)

            dfn = self.rotation_filename(self.baseFilename + ".1")
            dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, 1)))
            if len(dfn_):
                os.remove(dfn_[0])
            self.rotate(self.baseFilename, dfn)

        if not self.delay:
            self.stream = self._open()


# rota日志初始化
def rota_init_log(log_path="", log_file_name="log_test"):
    # 创建日志文件文件夹
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    # 设置默认级别
    logging.getLogger('').setLevel(logging.INFO)
    # 设置标准输出显示
    console = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
                                  '%(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    # 设置回滚文件
    log_file_name_ = "{}{}.log".format(log_file_name, "")

    rotating_file = RotatingFileHandler(os.path.join(log_path, log_file_name_),  maxBytes=20*1024*1024, backupCount=3)

    def namer(filename):
        dir_name, base_name  = os.path.split(filename)
        base_name = "{}_{}.log".format(base_name.replace('.log.', "_"), datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))
        rotation_filename = os.path.join(dir_name, base_name)
        return rotation_filename

    rotating_file.namer = namer
    rotating_file.suffix = "_"

    rotating_file.setFormatter(formatter)
    logging.getLogger('').addHandler(rotating_file)


# timed日志初始化
def timed_init_log(log_path="", log_file_name="log_test"):
    # 创建日志文件文件夹
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    # 设置默认级别
    logging.getLogger('').setLevel(logging.INFO)
    # 设置标准输出显示
    console = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
                                  '%(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    # 设置回滚文件
    log_file_name_ = "{}{}.log".format(log_file_name, "")
    rotating_file = TimedRotatingFileHandler(os.path.join(log_path, log_file_name_), when='S', interval=1, backupCount=3)

    def namer(filename):
        dir_name, base_name  = os.path.split(filename)
        base_name = base_name.replace(log_file_name_+'.', log_file_name)
        rotation_filename = os.path.join(dir_name, base_name)
        return rotation_filename

    rotating_file.namer = namer
    rotating_file.suffix = "_%Y-%m-%d_%H-%M-%S.log"

    rotating_file.setFormatter(formatter)
    logging.getLogger('').addHandler(rotating_file)


rota_init_log("./rota_logs", "log_{}".format(env))
timed_init_log("./time_logs", "log_{}".format(env))
i = 0
while True:
    logging.info("sdiogbdfnog{}".format(i))
    time.sleep(1)
    i += 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值