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

Python logging每日生成日志文件:捕获自身与Discord Bot日志求助

解决方案

要实现自身代码+Discord Bot模块日志统一写入每日轮转文件,核心是直接配置root logger(所有模块的日志最终都会向上传递到root),避免重复添加handler。你之前的问题根源在于同时给root和子logger加了文件handler,导致日志重复输出。

正确实现步骤

  1. 移除basicConfig的filename参数(它会给root自动加一个普通FileHandler,和手动添加的轮转handler冲突)
  2. 直接给root logger添加TimedRotatingFileHandler,统一处理所有日志
  3. 子logger(包括你的代码和Discord模块的)无需额外添加handler,只需确保日志级别正确,日志会自动向上传递到root处理

完整代码示例

import logging
from logging.handlers import TimedRotatingFileHandler

def setup_global_logger(log_file_name):
    # 获取root logger(所有日志的最终处理者)
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.DEBUG)  # 捕获所有级别日志

    # 清空root默认的handler(比如控制台handler,避免日志同时输出到控制台)
    if root_logger.hasHandlers():
        root_logger.handlers.clear()

    # 配置每日轮转的文件handler
    handler = TimedRotatingFileHandler(
        log_file_name,
        when="midnight",  # 午夜时分触发轮转
        interval=1,       # 每1天轮转一次
        backupCount=7     # 保留最近7天的历史日志
    )
    # 设置轮转后的日志文件名后缀(例如:app.log.20240520)
    handler.suffix = "%Y%m%d"
    # 设置日志格式(加入%(name)s可以区分是自身代码还是Discord模块的日志)
    formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")
    handler.setFormatter(formatter)

    # 将handler绑定到root logger
    root_logger.addHandler(handler)

# 程序启动时调用一次,初始化全局日志配置
setup_global_logger("app.log")

# 自身代码中使用logger的方式
my_logger = logging.getLogger(__name__)
my_logger.debug("这是我的业务代码日志")

# Discord Bot的日志会自动被root logger捕获,无需额外配置

关键说明

  • 解决重复日志:不再给子logger单独添加handler,所有日志都由root的轮转handler统一处理,彻底避免重复写入问题。
  • 捕获模块日志:Discord Bot的logger属于子logger,默认会将日志传递给root logger,因此它的输出也会被写入每日轮转的文件。
  • 保留控制台输出(可选):如果需要同时输出到控制台,可以给root logger额外添加一个StreamHandler,否则清空默认handler后日志只会写入文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:45:38