首页 > 编程语言 >Python 日志分级记录到不同文件的实现

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

时间:2024-11-06 18:41:42浏览次数:1  
标签:logging log Python self handler 分级 日志 logger

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 类的封装,提高了代码的可复用性和日志的管理效率。

标签:logging,log,Python,self,handler,分级,日志,logger
From: https://www.cnblogs.com/echohye/p/18530831

相关文章

  • 【日志分析平台】Logstash:IT-ELK日志分析平台
    以下文章来源于唯云轩,作者唯云轩上篇介绍了ELK日志分析平台-Elasticsearch集群的搭建,本篇章为大家介绍Logstash的安装服务器规划及Elasticsearch集群搭建参考上一篇:IT-ELK日志分析平台-Elasticsearch集群Logstash安装步骤如下官网下载安装包下载地址:(https://www.elasti......
  • python球探数据分析
    Python球探数据分析入门指南作为一名刚入行的小白,你可能会对如何使用Python进行球探数据分析感到困惑。不用担心,这篇文章将为你提供一份详细的入门指南,帮助你逐步掌握这项技能。流程概览首先,让我们通过一个表格来了解整个数据分析的流程:步骤描述1获取数据2数据......
  • Leetcode刷题Python之3254.长度为K的子数组的能量值I
    提示:关于数组子问题的挑战,涉及能量值的计算。文章目录一、问题描述示例二、解题思路三、代码实现1.引入库2.代码解释总结一、问题描述给定一个长度为n的整数数组nums和一个正整数k,我们需要计算每个长度为k的子数组的能量值。能量值的定义如下:如果子数......
  • c++ 嵌入 python问题
     在嵌入式Python环境中,确保你的C++应用程序能够加载静态编译的Python解释器,需要设置Python解释器的搜索路径。以下是实现这一目标的步骤:1.设置环境变量你可以通过设置环境变量 PYTHONHOME 来指定Python解释器的根目录。这个环境变量告诉Python解释器去哪里查找......
  • 【毕业设计】基于深度学习的水族馆生物识别 人工智能 深度学习 目标检测 Python
    一、背景意义    随着水族馆的普及和水生生态保护意识的提高,生物识别技术在水族馆管理、教育和研究中的重要性日益凸显。传统的生物识别方法往往依赖于人工观察和专家判断,效率低、准确性差且容易受到主观因素影响。水族馆中涉及的生物种类繁多,包括鱼类、虾类、海洋哺乳......
  • python项目打包指南
    #Python是解释型语言,我们写的Flask或Django项目如果部署,#源码可能会泄露,因此我们可以把项目打包成exe,来保护源码#需要用到工具-pyinstaller:把python项目打包成不同平台的可执行文件-nsis:NSIS(NullsoftScriptableInstallSystem)是一个开源的Windows系统下安装程序制作......
  • 第十三届蓝桥杯Python 大学 B 组 数位排序
    数位排序问题描述小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。例如,2022排在409前面,因为2022的数位之和是6,小于409的数位之和13。又如,......
  • 蓝桥杯【第13届省赛】Python B组 C题
    C:纸张尺寸【问题描述】    在ISO国际标准中定义了A0纸张的大小为1189mm×841mm,将A0纸沿长边对折后为A1纸,大小为841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将A1纸沿长边对折后为A2纸,依此类推。     输入纸张的名称......
  • 1.python的基本语法和简单数据类型
    1.1语法特点1.1.1注释语句单行注释在所需注释内容前加'#'号#我是一个注释多行注释'''(单引号/或双引号)注释代码''''''我是代码我是代码我是代码我是代码'''1.2.1缩进先看代码if<我是条件1>:<我是代码><我是代码>else:<我是......
  • 纯基础,新手小白也能学会:python的循环,循环控制以及图形输出(矩形,三角形,九九乘法表)
    python循环1.python的循环2.python循环控制3.图形输出1.矩形2.平行四边形3.直角三角形4.等腰直角三角形5.打印九九乘法表1.python的循环循环三要素:循环变量初始化循环条件改变循环变量i=1#循环变量初始化whilei<=5:print(f'跑到了第{i}圈')i......