首页 > 解决方案 > 使用 Flask-Login 时,如何将 current_user 的值插入到错误日志/电子邮件中?

问题描述

我的应用程序工厂中有以下代码...

mh = SMTPHandler(
    mailhost=app.config["MAIL_SERVER"],
    fromaddr=app.config["MAIL_DEFAULT_SENDER"],
    toaddrs=app.config["ERRORS_EMAIL"],
    subject="Error",
)
mh.setLevel(logging.ERROR)
app.logger.addHandler(mh)

有什么方法可以将“current_user”的值插入到电子邮件中的某处?

标签: pythonflaskloggingflask-login

解决方案


将上下文信息添加到日志输出可以通过将对象包装在Logger对象周围LoggerAdapter并提供您希望添加的额外信息来完成。下面是一个插图:

mh = SMTPHandler(
    mailhost=app.config["MAIL_SERVER"],
    fromaddr=app.config["MAIL_DEFAULT_SENDER"],
    toaddrs=app.config["ERRORS_EMAIL"],
    subject="Error",
)
mh.setLevel(logging.ERROR)
mh.setFormatter(logging.Formatter('%(user)s - %(message)s'))
app.logger.addHandler(mh)
app.logger = LoggerAdapter(app.logger, {'user': current_user})

这应该使用其他详细信息更新格式化程序,SMTPHandler并转换app.logger为具有LoggerAdapter作为字典提供的额外信息的对象。

在这种情况下,您可能还会发现这Filter符合要求。它们还可以提供更多的活力,尤其是对于特定于请求的值。您可以通过子类化Filter该类并提供您自己的filter方法实现来使用一个,这应该更新要记录的记录:

class CurrentUserFilter(logging.Filter):
    """
    Add a user attribute to all records
    """
    def filter(self, record):
        record.user = current_user
        return True  # Return True to pass the record to the next filter


mh = SMTPHandler(
    mailhost=app.config["MAIL_SERVER"],
    fromaddr=app.config["MAIL_DEFAULT_SENDER"],
    toaddrs=app.config["ERRORS_EMAIL"],
    subject="Error",
)
mh.setLevel(logging.ERROR)
mh.setFormatter(logging.Formatter('%(user)s - %(message)s'))
app.logger.addHandler(mh)
app.logger.addFilter(CurrentUserFilter())

这应该user为每个日志记录添加一个属性,而这些属性又会被格式化程序拾取。


推荐阅读