如何配置Logger.conf实现Python多日志器分级日志输出
Python多日志器统一配置实现方案
你可以直接使用Python标准库logging模块原生支持的ini格式编写Logger.conf,无需安装第三方依赖,所有脚本统一加载该配置文件即可实现需求。
编写Logger.conf配置文件
在项目根目录新建Logger.conf,写入以下内容:
[loggers] keys=root,log1,log2 [handlers] keys=h1_file, h1_stream, h2_file, h2_smtp [formatters] keys=f1_file, f1_stream, f2_file, f2_smtp # 根日志器空配置,避免日志重复传播 [logger_root] level=NOTSET handlers= # log1核心配置 [logger_log1] level=DEBUG handlers=h1_file, h1_stream qualname=log1 propagate=0 # log2核心配置 [logger_log2] level=INFO handlers=h2_file, h2_smtp qualname=log2 propagate=0 # log1文件处理器:写入logging.log,级别DEBUG [handler_h1_file] class=FileHandler level=DEBUG formatter=f1_file args=('logging.log', 'a', 'utf-8') # log1控制台处理器:输出到终端,级别WARNING [handler_h1_stream] class=StreamHandler level=WARNING formatter=f1_stream args=(sys.stderr,) # log2文件处理器:追加写入logging.log,级别INFO [handler_h2_file] class=FileHandler level=INFO formatter=f2_file args=('logging.log', 'a', 'utf-8') # log2邮件处理器:CRITICAL级别触发告警邮件 [handler_h2_smtp] class=handlers.SMTPHandler level=CRITICAL formatter=f2_smtp # 参数顺序:SMTP服务器地址、发件人邮箱、收件人列表、邮件标题、(SMTP账号, SMTP授权码) args=('替换为你的SMTP服务器地址', '替换为发件人邮箱', ['hello123@gmail.com','billyyes@gmail.com'], '系统严重日志告警', ('替换为SMTP登录账号', '替换为SMTP授权码')) # log1文件日志格式 [formatter_f1_file] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=%B-%d-%Y %H:%M:%S # log1控制台日志格式 [formatter_f1_stream] format=%(name)s - %(levelname)s - %(message)s # log2文件日志格式 [formatter_f2_file] format=%(name)s : %(message)s # log2邮件日志格式 [formatter_f2_smtp] format=%(levelname)s - %(message)s
各脚本加载配置
注意原示例代码中两处笔误需要修正:
- 日志打印方法为小写:
logger.DEBUG()应改为logger.debug(),其余INFO/WARNING/ERROR/CRITICAL同理改为小写 - 格式化字段
%(asctimes)为笔误,标准字段为%(asctime)s,上述配置已修正
script1.py(使用log1)
import logging import logging.config # 加载统一日志配置 logging.config.fileConfig('Logger.conf', encoding='utf-8') logger = logging.getLogger('log1') # 原有日志打印代码 logger.debug("hi this is a debug msg") logger.info("hi this is an info msg") logger.warning("hi this is a warning msg") logger.error("hi this is an error msg") logger.critical("hi this is a critical msg")
script2.py、script3.py(使用log2)
import logging import logging.config # 加载统一日志配置 logging.config.fileConfig('Logger.conf', encoding='utf-8') logger = logging.getLogger('log2') # 原有日志打印代码 logger.debug("hi this is a debug msg") logger.info("hi this is an info msg") logger.warning("hi this is a warning msg") logger.error("hi this is an error msg") logger.critical("hi this is a critical msg")
配置说明
- 两个业务日志器均设置
propagate=0,阻止日志向上传递到根日志器,避免重复打印 - 两个日志器的文件处理器均以追加模式写入同一个
logging.log文件,按脚本运行顺序先写入log1的所有DEBUG及以上级别日志,再追加log2的INFO及以上级别日志,和预期输出顺序完全一致 - 控制台处理器仅绑定在log1上,级别设为WARNING,因此控制台只会输出log1的WARNING、ERROR、CRITICAL级别日志,不会出现log2的日志
- 邮件处理器仅绑定在log2上,级别设为CRITICAL,只有log2触发CRITICAL级别日志时才会发送告警邮件,log1的所有日志都不会触发邮件
- SMTP处理器参数需要替换为实际的邮箱服务配置,例如Gmail的SMTP地址为
smtp.gmail.com、QQ邮箱为smtp.qq.com,授权码需要在邮箱后台开启SMTP服务后获取,否则无法正常发送邮件 - 默认配置下日志时间的月份为首字母大写格式(如
July),如果需要和示例一致的全大写月份(如JULY),可以自定义Formatter类重写时间格式化逻辑即可。
内容的提问来源于stack exchange,提问作者Bosser445
相关产品推荐
相关产品推荐

