Python2.7同项目多脚本如何共用统一logging日志配置
实现方法
1. 把日志配置封装到公共模块
假设你的公共模块命名为 common.py,将原有日志配置逻辑封装为可调用的函数,同时增加重复handler过滤逻辑,避免多次导入时重复添加handler导致日志重复输出:
from datetime import datetime import logging from logging import handlers def get_logger(): dt_now = datetime.today().strftime('%Y%m%d') sender = 'sender@domainname.com' recipients ='recipient@domainname.com' sub_err = "Process Failed" # 日志文件路径 log_file = "//some_server/some_dir/another_dir/logs/{}.txt".format(dt_now) # 用固定名称获取logger实例,保证全局唯一 logger = logging.getLogger("global_biz_logger") # 避免重复添加handler if logger.handlers: return logger logger.setLevel(logging.DEBUG) # 配置各handler file_handle = logging.FileHandler(log_file, encoding="utf-8") stream_handle = logging.StreamHandler() email_handle = handlers.SMTPHandler( mailhost="mailhost.domain.com", fromaddr=sender, toaddrs=recipients, subject=sub_err, secure=None ) # 设置各handler日志级别 email_handle.setLevel(logging.WARNING) file_handle.setLevel(logging.DEBUG) stream_handle.setLevel(logging.DEBUG) # 统一日志格式 log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handles = [email_handle, file_handle, stream_handle] for handle in handles: handle.setFormatter(log_format) logger.addHandler(handle) return logger
2. 业务脚本使用方式
所有业务脚本不需要再复制日志配置代码,只需要导入公共模块的get_logger函数即可直接使用:
from common import get_logger logger = get_logger() # 正常打印日志,会同时输出到控制台、写入日志文件 logger.debug("调试信息") logger.info("普通业务日志") # WARNING及以上级别的日志会额外触发告警邮件 logger.warning("警告信息") logger.error("错误信息")
注意事项
- 所有脚本调用
get_logger获取的是同一个单例logger实例,会将日志写入同一个按当天日期命名的日志文件 - 后续如果需要修改日志路径、收件人、邮件主题等配置,只需要修改公共模块中的
get_logger函数一处即可,所有业务脚本自动生效 - 增加的handler存在性判断可以避免多次导入时日志重复输出的问题
内容的提问来源于stack exchange,提问作者kjohnson
相关产品推荐
相关产品推荐

