{"title":"日志","version":"6.1","locale":"zh-hans","docname":"ref/logging","url":"/zh-hans/6.1/ref/logging/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/logging/","summary":"See also 如何配置和使用日志 Django 日志概览 Django 的日志模块扩展了 Python 内置的 logging 。 日志记录是作为 Django 的通用 django.setup() 函数的一部分进行配置的，因此除非明确禁用，否则始终可用。 Django 的默认日志配置 Link to this…","html":"<span id=\"logging-ref\"></span><h1>日志<a class=\"heading-anchor\" href=\"#logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/6.1/howto/logging/#logging-how-to\"><span class=\"std std-ref\">如何配置和使用日志</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/6.1/topics/logging/#logging-explanation\"><span class=\"std std-ref\">Django 日志概览</span></a></p></li>\n</ul>\n</aside>\n<p id=\"module-django.utils.log\">Django 的日志模块扩展了 Python 内置的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#module-logging\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">logging</span></code></a>。</p>\n<p>日志记录是作为 Django 的通用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/applications/#django.setup\" title=\"django.setup\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.setup()</span></code></a> 函数的一部分进行配置的，因此除非明确禁用，否则始终可用。</p>\n<section id=\"django-s-default-logging-configuration\">\n<span id=\"default-logging-configuration\"></span><h2>Django 的默认日志配置<a class=\"heading-anchor\" href=\"#django-s-default-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>默认情况下，Django 使用 Python 的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">logging.config.dictConfig 格式</span></a>。</p>\n<section id=\"default-logging-conditions\">\n<h3>默认的日志记录条件<a class=\"heading-anchor\" href=\"#default-logging-conditions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>完整的默认日志记录条件如下：</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> 记录器将 <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> 层次结构（<code class=\"docutils literal notranslate\"><span class=\"pre\">django.server</span></code> 除外）中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> 级别或更高的消息发送到控制台。</p></li>\n</ul>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 时：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> 记录器将 <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> 层次结构（<code class=\"docutils literal notranslate\"><span class=\"pre\">django.server</span></code> 除外）中带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code> 级别的消息发送到 <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a>。</p></li>\n</ul>\n<p>无论 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 的值如何：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django-server-logger\"><span class=\"std std-ref\">django.server</span></a> 记录器向控制台发送 <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> 或更高等级的消息。</p></li>\n</ul>\n<p>除了 <a class=\"reference internal\" href=\"#django-server-logger\"><span class=\"std std-ref\">django.server</span></a> 之外，所有的日志记录器都会将日志记录传播给它们的父辈，直到 <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> 的根日志记录器。<code class=\"docutils literal notranslate\"><span class=\"pre\">console</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins</span></code> 处理程序被附加到根记录器上，以提供上述行为。</p>\n<p>Python 的默认设置会将级别为 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 及更高级别的记录发送到控制台。</p>\n</section>\n<section id=\"default-logging-definition\">\n<span id=\"id1\"></span><h3>默认的日志定义<a class=\"heading-anchor\" href=\"#default-logging-definition\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 的默认日志配置继承了 Python 的默认设置。它以 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.log.DEFAULT_LOGGING</span></code> 的形式可用，并在 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/utils/log.py\">django/utils/log.py</a> 中定义如下：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span>\n    <span class=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;require_debug_false&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.RequireDebugFalse&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;require_debug_true&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.RequireDebugTrue&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;formatters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;django.server&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.ServerFormatter&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;[</span><span class=\"si\">{server_time}</span><span class=\"s2\">] </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;console&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;require_debug_true&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.StreamHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;django.server&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.StreamHandler&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;formatter&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.server&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;require_debug_false&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;console&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;django.server&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;django.server&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>请参阅 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/logging/#configuring-logging\"><span class=\"std std-ref\">日志模块的配置</span></a> 了解如何补充或替换此默认日志配置。</p>\n</section>\n</section>\n<section id=\"django-logging-extensions\">\n<h2>Django 日志扩展<a class=\"heading-anchor\" href=\"#django-logging-extensions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 提供了许多工具来处理在 Web 服务器环境中的日志记录特定要求。</p>\n<section id=\"loggers\">\n<h3>Loggers<a class=\"heading-anchor\" href=\"#loggers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 提供了几种内置的记录器。</p>\n<section id=\"django\">\n<span id=\"django-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code><a class=\"heading-anchor\" href=\"#django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> <a class=\"reference internal\" href=\"/zh-hans/6.1/howto/logging/#naming-loggers-hierarchy\"><span class=\"std std-ref\">命名的日志层次结构</span></a> 中，用于消息的父日志记录器。Django 不使用这个名称发布消息。而是使用以下其中一个日志记录器。</p>\n</section>\n<section id=\"django-request\">\n<span id=\"django-request-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code><a class=\"heading-anchor\" href=\"#django-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>记录与处理请求有关的信息。5XX 的响应以 <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> 消息的形式出现；4XX 的响应以 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 消息的形式出现。记录在 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.security</span></code> 记录器中的请求不会记录在 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code> 中。</p>\n<p>发送给此记录器的消息有以下额外的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">status_code</span></code>：与请求相关的 HTTP 响应代码。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>：产生记录信息的请求对象。</p></li>\n</ul>\n</section>\n<section id=\"django-server\">\n<span id=\"django-server-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.server</span></code><a class=\"heading-anchor\" href=\"#django-server\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>记录与处理由 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a> 命令调用的服务器收到的请求有关的消息。HTTP 5XX 响应被记录为 <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> 消息，4XX 响应被记录为 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 消息，其他所有消息被记录为 <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>。</p>\n<p>发送给此记录器的消息有以下额外的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">status_code</span></code>：与请求相关的 HTTP 响应代码。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>: The request object (a <a class=\"reference external\" href=\"https://docs.python.org/3/library/socket.html#socket.socket\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">socket.socket</span></code></a>) that generated\nthe logging message.</p></li>\n</ul>\n</section>\n<section id=\"django-template\">\n<span id=\"django-template-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.template</span></code><a class=\"heading-anchor\" href=\"#django-template\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>记录与模板渲染相关的消息。</p>\n<ul class=\"simple\">\n<li><p>缺少的上下文变量会被记录为 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 消息。</p></li>\n</ul>\n</section>\n<section id=\"django-db-backends\">\n<span id=\"django-db-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends</span></code><a class=\"heading-anchor\" href=\"#django-db-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>与代码与数据库互动有关的信息。例如，请求执行的每一条应用程序级别的 SQL 语句都会以 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 级别记录到这个记录器。</p>\n<p>发送给此记录器的消息有以下额外的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">duration</span></code>：执行 SQL 语句所需时间。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code>：所执行的 SQL 语句。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>：SQL 调用中使用的参数。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">alias</span></code>：SQL 调用中使用的数据库的别名。</p></li>\n</ul>\n<p>出于性能考虑，只有当 <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.DEBUG</span></code> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，才会启用 SQL 日志记录，而不考虑日志级别或安装的处理程序。</p>\n<p>这个日志记录不包括框架级别的初始化（例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">SET</span> <span class=\"pre\">TIMEZONE</span></code>）。如果希望查看所有数据库查询，请在数据库中启用查询日志记录。</p>\n</section>\n<section id=\"django-utils-autoreload\">\n<span id=\"django-utils-autoreloader-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.autoreload</span></code><a class=\"heading-anchor\" href=\"#django-utils-autoreload\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>与 Django 开发服务器执行期间自动代码重新加载相关的日志消息。此记录器在检测到源代码文件的修改时生成 <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> 消息，并在文件系统检查和事件订阅过程中可能生成 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 消息。</p>\n</section>\n<section id=\"django-contrib-auth\">\n<span id=\"django-contrib-auth-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code><a class=\"heading-anchor\" href=\"#django-contrib-auth\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Log messages related to <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/auth/\"><span class=\"doc\">django.contrib.auth</span></a>, particularly <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>\nmessages are generated when a\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/auth/default/#django.contrib.auth.forms.PasswordResetForm\" title=\"django.contrib.auth.forms.PasswordResetForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordResetForm</span></code></a> is successfully submitted\nbut the password reset email cannot be delivered due to a mail sending\nexception.</p>\n</section>\n<section id=\"django-contrib-gis\">\n<span id=\"django-contrib-gis-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.gis</span></code><a class=\"heading-anchor\" href=\"#django-contrib-gis\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Log messages related to <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/gis/\"><span class=\"doc\">GeoDjango</span></a> at various points: during\nthe loading of external GeoSpatial libraries (GEOS, GDAL, etc.) and when\nreporting errors. Each <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> log record includes the caught exception and\nrelevant contextual data.</p>\n</section>\n<section id=\"django-dispatch\">\n<span id=\"django-dispatch-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.dispatch</span></code><a class=\"heading-anchor\" href=\"#django-dispatch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>This logger is used in <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/\"><span class=\"doc\">信号</span></a>, specifically within the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/signals/#django.dispatch.Signal\" title=\"django.dispatch.Signal\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">Signal</span></code></a> class, to report issues when dispatching a\nsignal to a connected receiver. The <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> log record includes the caught\nexception as <code class=\"docutils literal notranslate\"><span class=\"pre\">exc_info</span></code> and adds the following extra context:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">receiver</span></code>：接收器的名称。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">err</span></code>：调用接收器时发生的异常。</p></li>\n</ul>\n</section>\n<section id=\"django-security\">\n<span id=\"django-security-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.security.*</span></code><a class=\"heading-anchor\" href=\"#django-security\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The security loggers will receive messages on any occurrence of\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code></a> and other security-related\nerrors. There is a sub-logger for each subtype of security error, including all\n<code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code>s. The level of the log event depends on where the\nexception is handled. Most occurrences are logged as a warning, while\nany <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code> that reaches the WSGI handler will be logged as an\nerror. For example, when an HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">Host</span></code> header is included in a request from\na client that does not match <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a>, Django will return a 400\nresponse, and an error message will be logged to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.security.DisallowedHost</span></code> logger.</p>\n<p>这些日志事件默认会到达 <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> 日志器，当 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG=False</span></code> 时，记录器会将错误事件发送给管理员。由于 <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code> 导致 400 响应的请求不会被记录到 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code> 记录器，而只会记录到 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.security</span></code> 记录器。</p>\n<p>要使某一特定类型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code> 保持沉默，你可以按照以下示例覆盖该特定的记录器：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;null&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.NullHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;django.security.DisallowedHost&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;null&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>其他不基于 <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.security</span></code> 记录器是：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.security.csrf</span></code>：用于 <a class=\"reference internal\" href=\"/zh-hans/6.1/howto/csrf/#csrf-rejected-requests\"><span class=\"std std-ref\">CSRF 错误</span></a>。</p></li>\n</ul>\n</section>\n<section id=\"django-db-backends-schema\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.schema</span></code><a class=\"heading-anchor\" href=\"#django-db-backends-schema\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>记录 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/migrations/\"><span class=\"doc\">migrations framework</span></a> 对数据库进行模式变更时执行的 SQL 查询。请注意，它不会记录 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunPython</span></code></a> 执行的查询。给这个记录器的消息在其额外的上下文中有 <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> （但与 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends</span></code> 不同，不是 duration）。这些值的含义与 <a class=\"reference internal\" href=\"#django-db-logger\"><span class=\"std std-ref\">django.db.backends</span></a> 中的解释相同。</p>\n</section>\n<section id=\"django-contrib-sessions\">\n<span id=\"django-contrib-sessions-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions</span></code><a class=\"heading-anchor\" href=\"#django-contrib-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>与 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/sessions/\"><span class=\"doc\">会话框架</span></a> 相关的日志消息。</p>\n<ul class=\"simple\">\n<li><p>使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/sessions/#django.contrib.sessions.backends.cached_db.SessionStore\" title=\"django.contrib.sessions.backends.cached_db.SessionStore\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions.backends.cached_db.SessionStore</span></code></a> 引擎时发生的非致命错误会记录为 <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> 消息，并带有相应的回溯。</p></li>\n</ul>\n</section>\n</section>\n<section id=\"handlers\">\n<h3>Handlers<a class=\"heading-anchor\" href=\"#handlers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>除了 Python 日志模块提供的处理程序外，Django 还提供了一个日志处理程序。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.log.AdminEmailHandler\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AdminEmailHandler</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include_html</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">email_backend</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reporter_class</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.AdminEmailHandler\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>该处理程序对收到的每条日志消息都会向站点 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> 发送一封邮件。</p>\n<p>如果日志记录中包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> 属性，电子邮件中会包含请求的全部细节。如果客户的 IP 地址在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-INTERNAL_IPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INTERNAL_IPS</span></code></a> 设置中，电子邮件主题将包括“内部 IP”；如果没有，则包括“外部 IP”。</p>\n<p>如果日志记录中包含堆栈跟踪信息，该堆栈跟踪信息将包含在电子邮件中。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">include_html</span></code> 参数用于控制是否在 traceback 邮件中包含一个 HTML 附件，该附件包含了如果 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时会生成的完整调试网页的内容。要在配置中设置此值，将其包含在 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.log.AdminEmailHandler</span></code> 的处理程序定义中，如下所示：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;include_html&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>在使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code> 时要注意 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/logging/#logging-security-implications\"><span class=\"std std-ref\">日志记录的安全性影响</span></a>。</p>\n<p>Email is sent using the default <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/email/#topic-email-configuration\"><span class=\"std std-ref\">mailer</span></a>.\nThis can be overridden by setting the <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code>, like this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;using&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;internal&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>If the specified mailer is not configured in the <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MAILERS</span></code></a>\nsetting, no email will be sent and no additional error will be raised.</p>\n<p>By setting the deprecated <code class=\"docutils literal notranslate\"><span class=\"pre\">email_backend</span></code> argument of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code>, the <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/email/#topic-email-backends\"><span class=\"std std-ref\">email backend</span></a> that\nis being used by the handler can be overridden. <code class=\"docutils literal notranslate\"><span class=\"pre\">email_backend</span></code> is not\nsupported when <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MAILERS</span></code></a> is defined or when the <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code>\nargument is provided.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">reporter_class</span></code> 参数允许提供一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.view.debug.ExceptionReporter</span></code> 子类来自定义邮件正文中发送的回溯文本。你提供一个字符串的导入路径到你想使用的类，像这样：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;include_html&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;reporter_class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;somepackage.error_reporter.CustomErrorReporter&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument was added.</p>\n</aside>\n<aside class=\"version-note version-deprecated\" data-version=\"6.1\">\n<p class=\"version-note-title\">Deprecated since Django 6.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 6.1: </span>The <code class=\"docutils literal notranslate\"><span class=\"pre\">email_backend</span></code> argument is deprecated. Use <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> instead.</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.utils.log.AdminEmailHandler.send_mail\">\n<span class=\"sig-name descname\"><span class=\"pre\">send_mail</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">subject</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">message</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.AdminEmailHandler.send_mail\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>向管理员用户发送邮件。要自定义这个行为，你可以将 <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a> 类子类化，并覆盖这个方法。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"filters\">\n<h3>过滤器<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>除了 Python 日志模块提供的日志过滤器外，Django 还提供了一些日志过滤器。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.log.CallbackFilter\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CallbackFilter</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">callback</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.CallbackFilter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个过滤器接受一个回调函数（它应该接受一个单一的参数，即要记录的记录），并对每个通过过滤器的记录进行调用。如果回调函数返回 False，则不会对该记录进行处理。</p>\n<p>例如，要从管理员邮件中过滤掉 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.http.UnreadablePostError\" title=\"django.http.UnreadablePostError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">UnreadablePostError</span></code></a> （当用户取消上传时引发），你可以创建一个过滤函数：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UnreadablePostError</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">skip_unreadable_post</span><span class=\"p\">(</span><span class=\"n\">record</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">record</span><span class=\"o\">.</span><span class=\"n\">exc_info</span><span class=\"p\">:</span>\n        <span class=\"n\">exc_type</span><span class=\"p\">,</span> <span class=\"n\">exc_value</span> <span class=\"o\">=</span> <span class=\"n\">record</span><span class=\"o\">.</span><span class=\"n\">exc_info</span><span class=\"p\">[:</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">exc_value</span><span class=\"p\">,</span> <span class=\"n\">UnreadablePostError</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>然后将其添加到你的日志记录配置中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;skip_unreadable_posts&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.CallbackFilter&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;callback&quot;</span><span class=\"p\">:</span> <span class=\"n\">skip_unreadable_post</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;skip_unreadable_posts&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.log.RequireDebugFalse\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RequireDebugFalse</span></span><a class=\"heading-anchor\" href=\"#django.utils.log.RequireDebugFalse\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>只有当 settings.DEBUG 为 False 时，该过滤器才会传递记录。</p>\n<p>该过滤器在默认的 <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">logging</span></code> 配置中使用如下，以确保 <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a> 只在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 时向管理员发送错误邮件：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;require_debug_false&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.RequireDebugFalse&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;require_debug_false&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.log.RequireDebugTrue\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RequireDebugTrue</span></span><a class=\"heading-anchor\" href=\"#django.utils.log.RequireDebugTrue\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>该过滤器类似于 <a class=\"reference internal\" href=\"#django.utils.log.RequireDebugFalse\" title=\"django.utils.log.RequireDebugFalse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequireDebugFalse</span></code></a>，但只有当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时才会传递记录。</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"logging","toc":[{"title":"Django 的默认日志配置","anchor":"django-s-default-logging-configuration","children":[{"title":"默认的日志记录条件","anchor":"default-logging-conditions","children":[]},{"title":"默认的日志定义","anchor":"default-logging-definition","children":[]}]},{"title":"Django 日志扩展","anchor":"django-logging-extensions","children":[{"title":"Loggers","anchor":"loggers","children":[{"title":"django","anchor":"django","children":[]},{"title":"django.request","anchor":"django-request","children":[]},{"title":"django.server","anchor":"django-server","children":[]},{"title":"django.template","anchor":"django-template","children":[]},{"title":"django.db.backends","anchor":"django-db-backends","children":[]},{"title":"django.utils.autoreload","anchor":"django-utils-autoreload","children":[]},{"title":"django.contrib.auth","anchor":"django-contrib-auth","children":[]},{"title":"django.contrib.gis","anchor":"django-contrib-gis","children":[]},{"title":"django.dispatch","anchor":"django-dispatch","children":[]},{"title":"django.security.*","anchor":"django-security","children":[]},{"title":"django.db.backends.schema","anchor":"django-db-backends-schema","children":[]},{"title":"django.contrib.sessions","anchor":"django-contrib-sessions","children":[]}]},{"title":"Handlers","anchor":"handlers","children":[]},{"title":"过滤器","anchor":"filters","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"}],"prev":{"docname":"ref/forms/validation","title":"表单和字段验证","url":"/zh-hans/6.1/ref/forms/validation/"},"next":{"docname":"ref/middleware","title":"中间件","url":"/zh-hans/6.1/ref/middleware/"},"formats":{"html":"/zh-hans/6.1/ref/logging/","markdown":"/zh-hans/6.1/ref/logging.md","json":"/zh-hans/6.1/ref/logging.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/logging.txt","official":"https://docs.djangoproject.com/zh-hans/6.1/ref/logging/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}