如何将外部对象传递到YAML日志记录配置文件?

时间:2019-11-18 22:59:00

标签: python logging formatting yaml smtplib

我正在尝试在YAML配置文件中设置SMTPHandler。每当脚本失败时,我希望记录器将电子邮件发送给启动脚本的人(例如user_email)。基于PEP 391,我试图通过在传入的字符串前加上ext://来引用该外部对象。

# config.yaml
version: 1
handlers:
  email:
    class: logging.handlers.SMTPHandler
    mailhost: ["smtp.office365.com", 587]
    fromaddr: "email@place.com"
    toaddrs: [ext://user_email]
    subject: "TEST"
    credentials: ["email@place.com", "password"]
    secure: []
    level: ERROR
loggers:
  __main__:
    level: INFO
    handlers: [email]
# __main__.py
import yaml
import logging
import getpass

import logging.config
import logging.handlers

username = getpass.getuser()
user_email = f"{username}@place.com"

with open(r'./config.yaml') as cfg:
    config = yaml.safe_load(cfg)
    logging.config.dictConfig(config)

log = logging.getLogger(__name__)

try:
    raise Exception()
except Exception:
    log.exception('Unhandled Exception')

运行此代码时,出现smtplib.SMTPRecipientsRefused错误,提示:

Traceback (most recent call last):
  File "/Users/jessenestler/anaconda3/envs/facilityid_env/lib/python3.7/logging/handlers.py", line 1020, in emit
    smtp.send_message(msg)
  File "/Users/jessenestler/anaconda3/envs/facilityid_env/lib/python3.7/smtplib.py", line 967, in send_message
    rcpt_options)
  File "/Users/jessenestler/anaconda3/envs/facilityid_env/lib/python3.7/smtplib.py", line 881, in sendmail
    raise SMTPRecipientsRefused(senderrs)
smtplib.SMTPRecipientsRefused: {'//user_email': (501, b'5.1.3 Invalid address')}

看来//不能正确剥离,但是即使我在配置文件中写入toaddrs: [ext:user_email],我仍然会遇到相同的错误,但是它显示smtplib.SMTPRecipientsRefused: {'user_email': (501, b'5.1.3 Invalid address')}

如何使我的YAML配置文件接受user_email变量,以便它成功发送电子邮件?我在Python 3.7中

1 个答案:

答案 0 :(得分:0)

我不知道这对您仍然有多重要,但我有完全相同的错误。

显然,问题出在yaml的解析器中,该解析器专门处理“ [ext:””字符序列。只需从中删除“ [”字符,然后将其保留为以下内容即可:

收件人:ext://script_name.user_email

其中user_email是在script_name.py内部声明的全局变量

我认为[ext:可能是yaml官方规范中的某些特殊语法或其他内容。真烦人

相关问题