如何配置Python logging同时输出至日志文件与终端?
Python 2.7 日志配置:同时输出终端和文件,子模块生效解决方案
嘿,我来帮你搞定这个Python 2.7的日志配置问题~ 咱们一步步拆解原因,再给出靠谱的解决办法:
问题根源拆解
设置
filename后终端无输出:
当你给logging.basicConfig()传filename参数时,它会自动给根Logger添加一个FileHandler,但默认负责终端输出的StreamHandler就不会被创建了,所以日志只进文件,终端看不到。手动加
FileHandler子模块不生效:
子模块的Logger(一般是logging.getLogger(__name__))会继承根Logger的配置。如果你的FileHandler只加到了主模块自己创建的Logger里,而非根Logger,子模块自然继承不到;另外如果没设置根Logger的级别(默认是WARNING),低于这个级别的日志会被直接过滤,也会看起来没输出。参考示例后无输出的可能原因:
大概率是没正确设置Logger/Handler的级别,或者没把Handler添加到根Logger上,导致日志被过滤或没找到输出渠道。
Python 2.7 可行配置方案
因为Python 2.7的logging.basicConfig()不支持handlers参数(这是3.3+才有的特性),咱们得手动给根Logger配置双Handler:
主模块配置代码
import logging import your_submodule # 导入你的子模块 # 获取根Logger,所有子模块的Logger都会继承它的配置 root_logger = logging.getLogger() # 设置全局日志级别(必须,默认是WARNING,低于这个级别的日志会被过滤) root_logger.setLevel(logging.DEBUG) # 1. 创建终端输出的StreamHandler stream_handler = logging.StreamHandler() # 可以单独设置终端输出的级别,比如只输出INFO及以上 stream_handler.setLevel(logging.INFO) # 2. 创建文件输出的FileHandler file_handler = logging.FileHandler('app.log') # 文件可以输出更详细的日志,比如DEBUG级别 file_handler.setLevel(logging.DEBUG) # 统一设置日志格式(可选,但推荐) log_formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) stream_handler.setFormatter(log_formatter) file_handler.setFormatter(log_formatter) # 将两个Handler添加到根Logger root_logger.addHandler(stream_handler) root_logger.addHandler(file_handler) # 主模块日志测试 root_logger.debug('主模块DEBUG日志(只会进文件)') root_logger.info('主模块INFO日志(终端+文件都有)')
子模块代码(无需额外配置)
import logging # 获取子模块专属Logger,自动继承根Logger的Handler和级别 logger = logging.getLogger(__name__) # 子模块日志测试 logger.debug('子模块DEBUG日志(只会进文件)') logger.info('子模块INFO日志(终端+文件都有)')
关键注意点
- 一定要设置根Logger的级别(
setLevel()),否则默认的WARNING会过滤掉DEBUG、INFO级别的日志。 - 不要给子模块的Logger单独设置
propagate=False(除非你刻意不想继承根配置),否则日志不会向上传递到根Logger的Handler。 - 如果之前调用过
logging.basicConfig(),可能已经给根Logger加了默认Handler,如果你想完全自定义,可以先调用root_logger.handlers = []清空默认Handler再添加自己的。
内容的提问来源于stack exchange,提问作者oxidworks
相关产品推荐
相关产品推荐

