Python程序中如何配置两个独立日志记录器(文件+标准输出)
Python双独立日志记录器的正确配置方法
你说得没错,logging.basicConfig()确实只能生效第一次调用,后续调用会被直接忽略——这就是你遇到所有日志都输出到标准输出的核心原因。第一次调用basicConfig给根日志器配置了文件Handler,但第二次调用因为根日志器已经有Handler了,所以完全没生效;而你创建的两个子日志器默认会继承根日志器的配置,导致日志输出不符合预期。
正确的做法是绕开basicConfig,直接给每个自定义日志器单独配置Handler、格式和级别,彻底隔离两个日志流:
完整实现代码
import logging # 配置文件日志记录器(给独立模块用) log_file = logging.getLogger('another_program') log_file.setLevel(logging.DEBUG) # 记录DEBUG及以上级别日志 log_file.propagate = False # 禁止日志传递到根日志器,避免干扰 # 创建文件Handler并设置格式 file_handler = logging.FileHandler('log.log', mode='a') file_formatter = logging.Formatter("%(asctime)s - %(lineno)d - %(message)s") file_handler.setFormatter(file_formatter) log_file.addHandler(file_handler) # 配置标准输出日志记录器(主程序用) log_stdout = logging.getLogger('main') log_stdout.setLevel(logging.ERROR) # 只记录ERROR及以上级别日志 log_stdout.propagate = False # 创建标准输出Handler并设置格式 stream_handler = logging.StreamHandler() stream_formatter = logging.Formatter("%(asctime)s - %(lineno)d - %(message)s") stream_handler.setFormatter(stream_formatter) log_stdout.addHandler(stream_handler) # 测试代码 # 这条不会输出,因为log_stdout级别是ERROR,INFO级别不够 log_stdout.info('This should NOT appear in stdout') # 这条会正常输出到标准输出 log_stdout.error('This should appear in stdout, from main program') # 模拟独立模块调用 def another_program(logger): logger.debug('Debug log from another module (written to log.log)') logger.info('Info log from another module (written to log.log)') another_program(logger=log_file)
关键注意点
propagate = False必须加:Python日志器默认会把日志向上传递给父级(直到根日志器),如果不关闭传播,根日志器的默认Handler(如果存在)会重复输出日志,导致混乱。- 日志级别要设置在Logger上:Handler默认会继承所属Logger的级别,单独设置Handler级别可以实现更细粒度的过滤,但一般先设置Logger级别就够了。
- 不要依赖basicConfig:它只是根日志器的快捷配置方式,适合简单场景;多日志器独立配置时,直接操作Logger和Handler才是可靠的方式。
内容的提问来源于stack exchange,提问作者Nullpointer
相关产品推荐
相关产品推荐

