Python logging每日生成日志文件:捕获自身与Discord Bot日志求助
解决方案
要实现自身代码+Discord Bot模块日志统一写入每日轮转文件,核心是直接配置root logger(所有模块的日志最终都会向上传递到root),避免重复添加handler。你之前的问题根源在于同时给root和子logger加了文件handler,导致日志重复输出。
正确实现步骤
- 移除
basicConfig的filename参数(它会给root自动加一个普通FileHandler,和手动添加的轮转handler冲突) - 直接给root logger添加
TimedRotatingFileHandler,统一处理所有日志 - 子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
相关产品推荐
相关产品推荐

