python - 使用 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”的值插入到电子邮件中的某处?
解决方案
将上下文信息添加到日志输出可以通过将对象包装在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
为每个日志记录添加一个属性,而这些属性又会被格式化程序拾取。
推荐阅读
- aggregate - R functions re-usability
- soap - Apache Camel 调用 SOAP 服务
- http - 如何在不停止的情况下导出 tshark 对象
- mysql - MYSQL (Mac) - 无法连接,服务器可能没有运行
- swift - 如何防止在状态更改swiftUI中刷新其他视图
- python - 有人能解释一下这段代码片段中 ResNet50 的负责人是如何变化的吗?
- javascript - Javascript:为玩家分配随机角色的百分比
- r - 从 R 中的 rle() 计算连续天数的第一次出现
- python - Python 开始:不知道如何告诉用户他们的数字是奇数还是偶数(对于 5 个数字)
- vpn - ipsec 隧道 - iptables 伪装间歇性工作