Python 日志分级记录到不同文件的实现

Python 日志分级记录到不同文件的实现

介绍如何使用 Python 的 logging 模块,按 INFOWARNINGERROR 级别将日志记录到不同的文件中。通过封装 CustomLogger 类,方便在项目中直接调用,简化日志管理。


1. 实现目标

  • 分级日志记录:将 INFOWARNINGERROR 级别的日志分别记录到不同的日志文件。
  • 日志文件命名:日志文件按日期命名,如 info-YYYY-MM-DD.logwarn-YYYY-MM-DD.logerror-YYYY-MM-DD.log
  • 封装成类:封装为 CustomLogger 类,方便在其他模块中调用。

2. 基础代码结构

定义 CustomLogger 类,将日志处理器和过滤器封装到类中,确保每个日志级别记录到不同文件。

import logging
from datetime import datetime
import os

class CustomLogger:
    def __init__(self, log_dir="logs"):
        # 设置日志目录
        self.log_dir = log_dir
        if not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)

        # 创建主记录器
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.DEBUG)

        # 配置不同级别的日志文件处理器
        self._add_handlers()

    def _add_handlers(self):
        # 获取当前日期,用于日志文件名
        current_date = datetime.now().strftime("%Y-%m-%d")
        
        # INFO级别的日志文件
        info_handler = logging.FileHandler(os.path.join(self.log_dir, f"info-{current_date}.log"), mode='a', encoding="utf-8")
        info_handler.setLevel(logging.INFO)
        info_handler.addFilter(self.LevelFilter(logging.INFO))
        info_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        
        # WARNING级别的日志文件
        warn_handler = logging.FileHandler(os.path.join(self.log_dir, f"warn-{current_date}.log"), mode='a', encoding="utf-8")
        warn_handler.setLevel(logging.WARNING)
        warn_handler.addFilter(self.LevelFilter(logging.WARNING))
        warn_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        
        # ERROR级别的日志文件
        error_handler = logging.FileHandler(os.path.join(self.log_dir, f"error-{current_date}.log"), mode='a', encoding="utf-8")
        error_handler.setLevel(logging.ERROR)
        error_handler.addFilter(self.LevelFilter(logging.ERROR))
        error_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

        # 将处理器添加到主记录器
        self.logger.addHandler(info_handler)
        self.logger.addHandler(warn_handler)
        self.logger.addHandler(error_handler)

    class LevelFilter(logging.Filter):
        """自定义过滤器,用于过滤指定级别的日志"""
        def __init__(self, level):
            self.level = level
        
        def filter(self, record):
            return record.levelno == self.level

    # 日志记录方法封装
    def info(self, message):
        self.logger.info(message)
        
    def warning(self, message):
        self.logger.warning(message)
        
    def error(self, message):
        self.logger.error(message)
        
    def debug(self, message):
        self.logger.debug(message)

# 示例调用
if __name__ == "__main__":
    custom_logger = CustomLogger()
    custom_logger.info("这是一个INFO级别的日志")
    custom_logger.warning("这是一个WARNING级别的日志")
    custom_logger.error("这是一个ERROR级别的日志")
    custom_logger.debug("这是一个DEBUG级别的日志")  # DEBUG日志不会记录到任何文件

3. 代码说明

  • 自定义过滤器:使用 LevelFilter 类,只允许处理器记录其指定级别的日志,防止日志文件中包含其他级别的日志。

    class LevelFilter(logging.Filter):
        def __init__(self, level):
            self.level = level
        
        def filter(self, record):
            return record.levelno == self.level
    
  • 日志文件处理器配置:在 _add_handlers 方法中,为每个日志级别创建单独的 FileHandler,并为每个处理器添加 LevelFilter 过滤器。

  • 日志方法封装:提供 infowarningerrordebug 方法,直接调用封装的日志方法记录对应级别的日志。


4. 使用示例

在其他模块中调用 CustomLogger

from custom_logger import CustomLogger

# 创建日志实例
logger = CustomLogger()

# 记录日志
logger.info("系统启动成功")
logger.warning("可能存在配置问题")
logger.error("未能连接到数据库")

5. 运行效果

创建的日志文件目录 logs/ 中包含按日期和日志级别生成的文件:

  • logs/info-YYYY-MM-DD.log:记录 INFO 级别日志
  • logs/warn-YYYY-MM-DD.log:记录 WARNING 级别日志
  • logs/error-YYYY-MM-DD.log:记录 ERROR 级别日志

6. 注意事项

  • 日志目录:若未指定目录,将默认创建在当前路径下的 logs 文件夹中。
  • 日志文件自动生成:每日生成一个新日志文件,便于长期日志管理。

总结

本文实现了按日志级别分类记录文件的 Python 日志系统,通过 CustomLogger 类的封装,提高了代码的可复用性和日志的管理效率。

posted @   槑孒  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
历史上的今天:
2023-11-06 vue3+vite 代码混淆插件 | JavaScript obfuscator
点击右上角即可分享
微信分享提示