如何让Postfix调用的Python脚本日志写入mail.log(无需抛SystemExit异常)
解决Postfix mailbox_command中Python脚本日志写入mail.log的问题
核心原因
Postfix会捕获mailbox_command指定脚本的**标准错误(stderr)输出,并将其写入/var/log/mail.log。而Python的logging模块默认配置下,日志是输出到标准输出(stdout)**的,所以不会被Postfix捕获。
无需抛出SystemExit的实现方法
直接修改Python脚本的logging配置,让日志输出到stderr即可,以下是几种实用方式:
方法1:基础配置指定输出到stderr
import logging import sys # 配置logging将错误日志输出到stderr logging.basicConfig( level=logging.ERROR, stream=sys.stderr, format='%(asctime)s - %(levelname)s - %(message)s' ) # 测试日志输出 logging.error("这条错误日志会被Postfix捕获并写入mail.log")
方法2:自定义Logger添加stderr Handler
如果已有自定义logging结构,直接添加指向stderr的Handler即可:
import logging import sys # 初始化自定义Logger logger = logging.getLogger("mail_handler") logger.setLevel(logging.ERROR) # 创建stderr输出Handler并设置格式 stderr_handler = logging.StreamHandler(sys.stderr) log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stderr_handler.setFormatter(log_formatter) logger.addHandler(stderr_handler) # 测试输出 logger.error("自定义Logger的错误日志已写入mail.log")
方法3:临时重定向stdout到stderr(应急方案)
如果不想改动logging配置,可在脚本开头将标准输出重定向到标准错误:
import sys # 把stdout指向stderr sys.stdout = sys.stderr import logging logging.basicConfig(level=logging.ERROR) logging.error("重定向后的日志已进入mail.log")
验证方式
修改脚本后触发日志输出,查看/var/log/mail.log即可看到对应的错误日志内容,全程无需抛出SystemExit异常。
内容的提问来源于stack exchange,提问作者jcfollower
相关产品推荐
相关产品推荐

