You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化这段Python日志配置代码?求简化实现方案

简化Python日志配置的方案

核心优化思路

原代码存在大量重复逻辑(重复创建处理器、重复设置格式等),可以通过复用公共配置、封装重复逻辑来简化,同时可以通过共享格式器实现统一格式的效果。

优化后的代码示例

import logging
from logging.handlers import RotatingFileHandler

# 1. 定义全局通用格式,创建一次格式器对象
LOG_FORMAT = "%(asctime)s %(levelname)s %(message)s"
global_formatter = logging.Formatter(LOG_FORMAT)

# 配置根日志器的控制台输出
logging.basicConfig(
    format=LOG_FORMAT,
    encoding="utf-8",
    handlers=[logging.StreamHandler()]
)

# 2. 封装RotatingFileHandler的创建逻辑,复用公共配置
def build_rotating_handler(file_name):
    handler = RotatingFileHandler(
        filename=file_name,
        maxBytes=5 * 1024 * 1024,
        backupCount=5
    )
    handler.namer = lambda name: name.replace(".log.", "") + ".log"
    handler.setFormatter(global_formatter)  # 复用全局格式器
    return handler

# 3. 创建子日志器,调用封装函数生成处理器
logger_info = logging.getLogger(f"{__name__}_info")
logger_info.setLevel(logging.INFO)
logger_info.addHandler(build_rotating_handler(f"{__name__}_info.log"))

logger_error = logging.getLogger(f"{__name__}_error")
logger_error.setLevel(logging.ERROR)
logger_error.addHandler(build_rotating_handler(f"{__name__}_error.log"))

# 测试日志输出
logger_info.info("test info message 1")
logger_error.error("test error message 1")
logger_info.info("test info message 2")
logger_error.error("test error message 2")
logger_info.info("test info message 3")
logger_error.error("test error message 3")

关键优化点说明

  • 统一格式管理:只定义一次格式字符串,创建全局格式器对象,所有文件处理器共享该格式器,既避免重复代码,也实现了格式的统一维护
  • 封装处理器创建:把重复的处理器配置逻辑(文件大小、备份数量、命名规则、格式绑定)封装成函数,只需传入文件名即可生成配置完成的处理器
  • 关于格式继承:日志器的处理器不会自动继承根日志器的格式,但通过共享同一个Formatter对象,能达到和"继承"一致的效果,且更灵活可控

可选优化:利用日志器继承

如果希望子日志器继承根日志器的级别等配置,可以调整为子日志器结构,同时控制日志传播行为:

# 根日志器设置基础级别为INFO
logging.basicConfig(
    level=logging.INFO,
    format=LOG_FORMAT,
    encoding="utf-8",
    handlers=[logging.StreamHandler()]
)

# 创建根日志器的子日志器,自动继承根配置
logger_info = logging.getLogger(f"{__name__}.info")
logger_info.addHandler(build_rotating_handler(f"{__name__}_info.log"))
logger_info.propagate = False  # 避免日志重复输出到控制台

logger_error = logging.getLogger(f"{__name__}.error")
logger_error.setLevel(logging.ERROR)  # 覆盖继承级别,只处理ERROR及以上日志
logger_error.addHandler(build_rotating_handler(f"{__name__}_error.log"))

内容的提问来源于stack exchange,提问作者NickC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:13:09