Python 3 logging.TimedRotatingFileHandler分等级写入不同文件夹

本文详细介绍了Python中使用TimedRotatingFileHandler实现基于时间的日志文件回滚,同时根据不同日志级别存储到不同文件的高级配置方法。通过具体代码示例,展示了如何设置日志文件的自动分割、存储路径及格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 3 中的logging 日志文件的回滚模块RotatingFileHandler,主要有两种方式,一种是基于文件的大小进行回滚,第二种是基于当前系统时间进行回滚。但是我们都希望将不同等级的信息放在不同的文件中,第一种目前已有较多的参考,以文件大小方式
当然基于时间回滚的方法即 通过调用TimedRotatingFileHandler()函数进行配置即可,详细的代码见如下`

import os
import time
import logging
import inspect
from logging.handlers import TimedRotatingFileHandler

logging.basicConfig(filemode='a'##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                     )
dir = os.path.dirname(__file__)
dir_time = time.strftime('%Y-%m-%d', time.localtime())

handlers = {
            # logging.NOTSET: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/notset.log'%dir_time),
            #
            # logging.DEBUG: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/debug.log'%dir_time),

     logging.INFO: os.path.join(dir, 'D:/project/Program/ZXControl/log/Track_info'),

            # logging.WARNING: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/warning.log'%dir_time),

            logging.ERROR: os.path.join(dir, 'D:/project/Program/ZXControl/log/error'),

            # logging.CRITICAL: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/critical.log'%dir_time),
            }


def createHandlers():
    logLevels = handlers.keys()

    for level in logLevels:
        save_dir = "D:/project/Program/ZXControl/log/"
        if os.path.exists(save_dir) is False:
            os.makedirs(save_dir)
        path = os.path.abspath(handlers[level])
        handlers[level] = TimedRotatingFileHandler(path, backupCount=0, encoding='utf-8',when='D', interval=1)
        # backupCount:允许存储的文件个数,如果大于这个数系统会删除最早的日志文件
        #when='D' 代表以天为间隔 S:秒   H:小时 
        # interval=1 代表间隔多少个 when  进行一次日志分割
        TimedRotatingFileHandler.suffix = '%Y-%m-%d.log'



createHandlers()

class TNLog(object):
    # 加载模块时创建全局变量
    # dir_time = time.strftime('%Y-%m-%d', time.localtime())

    def printfNow(self):
        return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

    def __init__(self, level=logging.NOTSET):
        self.__loggers = {}

        logLevels = handlers.keys()

        for level in logLevels:
            logger = logging.getLogger(str(level))

            # 如果不指定level,获得的handler似乎是同一个handler?s

            logger.addHandler(handlers[level])

            logger.setLevel(level)

            self.__loggers.update({level: logger})

    def getLogMessage(self, level, message):
        frame, filename, lineNo, functionName, code, unknowField = inspect.stack()[2]

        # 日志格式:[时间] [类型] [记录代码] 信息

        return "[%s] [%s] [%s - %s - %s] %s" % (self.printfNow(), level, filename, lineNo, functionName, message)

    def info(self, message):
        message = self.getLogMessage("info", message)

        self.__loggers[logging.INFO].info(message)

    def error(self, message):
        message = self.getLogMessage("error", message)

        self.__loggers[logging.ERROR].error(message)

    def warning(self, message):
        message = self.getLogMessage("warning", message)

        self.__loggers[logging.WARNING].warning(message)

    def debug(self, message):
        message = self.getLogMessage("debug", message)

        self.__loggers[logging.DEBUG].debug(message)

    def critical(self, message):
        message = self.getLogMessage("critical", message)

        self.__loggers[logging.CRITICAL].critical(message)
        ```
	if __name__ == "__main__":
    while 1:
        logger = TNLog()
        a=10
        # logger.debug("debug")
        # logger.debug("test")
        logger.info("info"+str(a))
        # logger.warning("warning")
        logger.error("error")
        # logger.critical("critical")
        time.sleep(10)`

``
handlers[level] = TimedRotatingFileHandler(path, backupCount=0, encoding=‘utf-8’,when=‘D’, interval=1)
# backupCount:允许存储的文件个数,如果大于这个数系统会删除最早的日志文件
#when=‘D’ 代表以天为间隔 S:秒 H:小时
# interval=1 代表间隔多少个 when 进行一次日志分割

注意!按照官方给的logger文件,日志文件的结尾是以日期结束的,so 进入到官方的hadlers.py文件中相应的命名规则,见图中红框所示的位置,统一加上.log。文件更改位置
这样自动保存下来的日志文件,就可以自动以.log进行结尾了,如图所示。
记录结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值