使用logging.handlers.TimedRotatingFileHandler按日期切割日志问题

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

LOG_PATH = "logs"


def get_logger(name):
    logger = logging.getLogger(name)
    if os.path.exists(LOG_PATH):
        pass
    else:
        os.mkdir(LOG_PATH)
    # 设置日志基础级别
    logger.setLevel(logging.DEBUG)
    # 日志格式
    formatter = '%(asctime)s | %(levelname)s | %(thread)d | %(filename)s - %(funcName)s : %(message)s'

    log_formatter = logging.Formatter(formatter)
    # 控制台日志
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setFormatter(log_formatter)
    # info日志文件名
    info_file_name = 'info-' + time.strftime(
        '%Y-%m-%d', time.localtime(time.time())) + '.log'
    # info日志处理器
    # filename:日志文件名
    # when:日志文件按什么维度切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周
    #       这里需要注意,如果选择 D-天,那么这个不是严格意义上的'天',而是从你
    #       项目启动开始,过了24小时,才会从新创建一个新的日志文件,
    #       如果项目重启,这个时间就会重置。所以这里选择'MIDNIGHT'-是指过了午夜
    #       12点,就会创建新的日志。
    # interval:是指等待多少个单位 when 的时间后,Logger会自动重建文件。
    # backupCount:是保留日志个数。默认的0是不会自动删除掉日志。
    info_handler = TimedRotatingFileHandler(filename='logs/info/' +
                                            info_file_name,
                                            when='MIDNIGHT',
                                            interval=1,
                                            backupCount=7,
                                            encoding='utf-8')
    info_handler.setFormatter(log_formatter)
    info_handler.setLevel(logging.INFO)
    # error日志文件名
    error_file_name = 'error-' + time.strftime(
        '%Y-%m-%d', time.localtime(time.time())) + '.log'
    # 错误日志处理器
    err_handler = TimedRotatingFileHandler(filename='logs/error/' +
                                           error_file_name,
                                           when='MIDNIGHT',
                                           interval=1,
                                           backupCount=7,
                                           encoding='utf-8')
    err_handler.setFormatter(log_formatter)
    err_handler.setLevel(logging.ERROR)
    # 添加日志处理器
    logger.addHandler(info_handler)
    logger.addHandler(err_handler)
    logger.addHandler(console_handler)
    return logger

### 创建按天切分并带有日期标记的日志文件 为了实现每天自动切换日志文件,并且让每个日志文件都带上日期作为其一部分名称的功能,可以利用 `logging` 模块中的 `TimedRotatingFileHandler` 类来完成这一需求[^1]。 下面是一个具体的例子: ```python import logging from logging.handlers import TimedRotatingFileHandler import datetime # 设置logger对象 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 定义日志格式 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # 创建一个处理器实例,指定日志轮转策略为基于时间的轮转 log_file = "app.log" handler = TimedRotatingFileHandler(log_file, when="midnight", interval=1, backupCount=7) handler.suffix = "%Y-%m-%d" # 给处理器设置格式器 handler.setFormatter(formatter) # 将处理器添加到logger中 logger.addHandler(handler) def log_message(message): logger.info(message) if __name__ == "__main__": # 测试写入几条消息至日志文件 messages = ["This is the first message.", "Here comes another one."] for msg in messages: log_message(msg) ``` 上述代码实现了如下功能: - 日志会按照午夜时刻进行切割; - 新生成的日志文件将以当前日期命名(例如 app-2024-03-15.log); - 只保留最近七天的日志文件,超过这个范围的老日志会被删除。 通过这种方式,不仅可以保持良好的可读性和管理性,还能够有效地控制磁盘空间占用情况。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值