正确的日志记录配置以禁用 django 错误电子邮件



我刚刚让哨兵在我的环境中工作,我尝试调整我的日志记录以使其停止发送错误电子邮件,但它仍然是,我不明白为什么。我的日志记录配置是:

LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": '%(levelname)s %(asctime)s (%(pathname)s %(funcName)s): "%(message)s"'
},
"simple": {"format": "%(levelname)s %(message)s"},
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[%(server_time)s] %(message)s",
},
},
"handlers": {
"null": {"level": "DEBUG", "class": "logging.NullHandler",},
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "simple",
},
"log_file": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"filename": "/var/log/courtlistener/django.log",
"maxBytes": "16777216",  # 16 megabytes
"formatter": "verbose",
},
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
},
},
"loggers": {
# Disable SuspiciousOperation.DisallowedHost exception ("Invalid
# HTTP_HOST" header messages.) This appears to be caused by clients that
# don't support SNI, and which are browsing to other domains on the
# server. The most relevant bad client is the googlebot.
"django.security.DisallowedHost": {
"handlers": ["null"],
"propagate": False,
},
"django.server": {
"handlers": ["django.server"],
"level": "INFO",
"propagate": False,
},
# This is the one that's used practically everywhere in the code.
"cl": {"handlers": ["log_file"], "level": "INFO", "propagate": True,},
},
}

这里缺少一块吗?我不知道这怎么可能发送电子邮件。我应该考虑其他配置变量吗?

更新:我注意到的一件事是我现在收到纯文本错误电子邮件,而不是我以前收到的 HTML。当我调整日志记录配置时,这种情况发生了变化,但我不知道为什么,谷歌搜索它似乎没有透露任何东西。

Django 设置了一个默认的mail_admins处理程序,你不能简单地在handlers部分中替换它,所以如果你想摆脱它,你需要覆盖根记录器中的handlers

除了 django.server 之外的所有记录器都将日志记录传播到它们的父级,直到根 django 记录器。控制台和mail_admins处理程序附加到根记录器以提供上述行为。

LOGGING = {
'loggers': {
'django': {
'handlers': [],
'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
'propagate': False,
},
},
}

[编辑] 修复了关于覆盖处理程序类的错误语句,可悲的是它没有按预期工作,似乎以某种方式进行了硬编码(太忙而无法在 Django 代码库中查找它(。

您的LOGGING配置对我来说看起来(几乎,见最后(很好。我能想到的其他一些事情。

也许您进行了更改,但并非在所有更改,您可能还有其他应用程序,芹菜进程,暂存部署等在您忘记的地方运行。

也许还有其他东西(我不确定是什么...(正在配置此日志记录处理程序。如果是这种情况,您可以禁用现有记录器:

LOGGING = {
"disable_existing_loggers": True,
...
}

不过,这不是一个好主意,禁用其他人的记录器,因此作为替代方案,您可以通过另一种方式禁用它。

ADMINS设置定义了要将错误发送到的电子邮件地址,因此您只需将其设置为空列表即可禁用它:

ADMINS = []

这应该是相对安全的,因为发送错误电子邮件是此设置的唯一用途 - 除非您或第三方应用程序正在使用它。

您还可以收到不是服务器错误而是 404 错误的电子邮件。确保您的MIDDLEWARE不包含BrokenLinkEmailsMiddleware。还有一个类似的设置可以ADMINS,但它被称为MANAGERS

MANAGERS = []

您还应该检查默认日志记录配置,以确保在创建自己的LOGGING字典时没有遗漏某些内容。

在将LOGGING配置插入项目时,我注意到的另一件事是配置无法为我正确解析,因为maxBytes的值应该是 int,而不是字符串。因此,您也可以尝试更改:

"log_file": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"filename": "/var/log/courtlistener/django.log",
"maxBytes": "16777216",  # 16 megabytes
"formatter": "verbose",
}

自:

"log_file": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"filename": "/var/log/courtlistener/django.log",
"maxBytes": 16777216,  # 16 megabytes
"formatter": "verbose",
}

我在设置中有 Django 3.2 和 ADMINS=[],我最终来到这里是因为"mail_admins"处理程序正在尝试格式化它不会发送的电子邮件时破坏内存限制。

有几件事可能对未来的人们有所帮助:

1:logging_tree包是你的朋友,运行python manage.py shell -c "import logging_tree; logging_tree.printout()"得到一个基线,然后在每次更改后运行它,并将输出与基线进行比较。

2:当配置运行时,处理程序将烘焙到记录器。Djangos 默认配置在你之前运行。因此,您无法覆盖日志记录配置中的"mail_admins"处理程序,它已经烘焙到"django"记录器中。您可以覆盖"django"记录器,但这将重置该记录器及其下方的所有配置。

3:所以我在 settings.py 做了一件肮脏的事情,效果非常好:log.DEFAULT_LOGGING["handlers"]["mail_admins"]["class"] = "logging.NullHandler"这会在 Django 的日志记录配置加载之前杀死它。它可能会在 Django 更新时中断,但它应该大声中断。

相关内容

最新更新