Python 日志分级记录到不同文件的实现
介绍如何使用 Python 的 logging
模块,按 INFO
、WARNING
和 ERROR
级别将日志记录到不同的文件中。通过封装 CustomLogger
类,方便在项目中直接调用,简化日志管理。
1. 实现目标
- 分级日志记录:将
INFO
、WARNING
、ERROR
级别的日志分别记录到不同的日志文件。 - 日志文件命名:日志文件按日期命名,如
info-YYYY-MM-DD.log
、warn-YYYY-MM-DD.log
和error-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
过滤器。 -
日志方法封装:提供
info
、warning
、error
和debug
方法,直接调用封装的日志方法记录对应级别的日志。
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
类的封装,提高了代码的可复用性和日志的管理效率。