{"title":"日志","version":"3.1","locale":"zh-hans","docname":"topics/logging","url":"/zh-hans/3.1/topics/logging/","canonical":"https://djangodocs.dev/zh-hans/3.1/topics/logging/","summary":"Django 使用 Python 内置的 logging 模块处理系统日志。关于该模块的使用，Python 文档里有更详细的讨论。","html":"<span id=\"logging\"></span><h1>日志<a class=\"heading-anchor\" href=\"#module-django.utils.log\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"a-quick-logging-primer\">\n<h2>日志管理快速入门<a class=\"heading-anchor\" href=\"#a-quick-logging-primer\"><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.html#module-logging\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">logging</code></a> 模块处理系统日志。关于该模块的使用，Python 文档里有更详细的讨论。不过，如果你从未用过 Python 的 logging 框架（或者即便你用过），这里是一篇快速入门。</p>\n<section id=\"the-cast-of-players\">\n<h3>日志框架的组成元素<a class=\"heading-anchor\" href=\"#the-cast-of-players\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>一份 Python logging 配置有下面四个部分组成：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-loggers\"><span class=\"std std-ref\">Loggers</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-handlers\"><span class=\"std std-ref\">Handlers</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-filters\"><span class=\"std std-ref\">过滤器</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-formatters\"><span class=\"std std-ref\">Formatters</span></a></p></li>\n</ul>\n<section id=\"loggers\">\n<span id=\"topic-logging-parts-loggers\"></span><h4>Loggers<a class=\"heading-anchor\" href=\"#loggers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>logger 是日志系统的入口。每个 logger 都是命名了的 bucket， 消息写入 bucket 以便进一步处理。</p>\n<p>logger 可以配置 <em>日志级别</em>。日志级别描述了由该 logger 处理的消息的严重性。Python 定义了下面几种日志级别：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">DEBUG</code>：排查故障时使用的低级别系统信息</p></li>\n<li><p><code class=\"docutils literal notranslate\">INFO</code>：一般的系统信息</p></li>\n<li><p><code class=\"docutils literal notranslate\">WARNING</code>：描述系统发生了一些小问题的信息</p></li>\n<li><p><code class=\"docutils literal notranslate\">ERROR</code>：描述系统发生了大问题的信息</p></li>\n<li><p><code class=\"docutils literal notranslate\">CRITICAL</code>：描述系统发生严重问题的信息</p></li>\n</ul>\n<p>每一条写入 logger 的消息都是一条 <em>日志记录</em>。每一条日志记录也包含 <em>日志级别</em>，代表对应消息的严重程度。日志记录还包含有用的元数据，来描述被记录了日志的事件细节，例如堆栈跟踪或者错误码。</p>\n<p>当 logger 处理一条消息时，会将自己的日志级别和这条消息的日志级别做对比。如果消息的日志级别匹配或者高于 logger 的日志级别，它就会被进一步处理。否则这条消息就会被忽略掉。</p>\n<p>当 logger 确定了一条消息需要处理之后，会把它传给 <em>Handler</em>。</p>\n</section>\n<section id=\"handlers\">\n<span id=\"topic-logging-parts-handlers\"></span><h4>Handlers<a class=\"heading-anchor\" href=\"#handlers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Handler 是决定如何处理 logger 中每一条消息的引擎。它描述特定的日志行为，比如把消息输出到屏幕、文件或网络 socket。</p>\n<p>和 logger 一样，handler 也有日志级别的概念。如果一条日志记录的级别不匹配或者低于 handler 的日志级别，对应的消息会被 handler 忽略。</p>\n<p>一个 logger 可以有多个 handler，每一个 handler 可以有不同的日志级别。这样就可以根据消息的重要性不同，来提供不同格式的输出。例如，你可以添加一个 handler 把  <code class=\"docutils literal notranslate\">ERROR</code> 和 <code class=\"docutils literal notranslate\">CRITICAL</code> 消息发到寻呼机，再添加另一个 handler 把所有的消息（包括 <code class=\"docutils literal notranslate\">ERROR</code> 和 <code class=\"docutils literal notranslate\">CRITICAL</code> 消息）保存到文件里以便日后分析。</p>\n</section>\n<section id=\"filters\">\n<span id=\"topic-logging-parts-filters\"></span><h4>过滤器<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>在日志记录从 logger 传到 handler 的过程中，使用 Filter 来做额外的控制。</p>\n<p>默认情况下，只要级别匹配，任何日志消息都会被处理。不过，也可以通过添加 filter 来给日志处理的过程增加额外条件。例如，可以添加一个 filter 只允许某个特定来源的 <code class=\"docutils literal notranslate\">ERROR</code> 消息输出。</p>\n<p>Filter 还被用来在日志输出之前对日志记录做修改。例如，可以写一个 filter，当满足一定条件时，把日志记录从 <code class=\"docutils literal notranslate\">ERROR</code> 降到 <code class=\"docutils literal notranslate\">WARNING</code> 级别。</p>\n<p>Filter 在 logger 和 handler 中都可以添加；多个 filter 可以链接起来使用，来做多重过滤操作。</p>\n</section>\n<section id=\"formatters\">\n<span id=\"topic-logging-parts-formatters\"></span><h4>Formatters<a class=\"heading-anchor\" href=\"#formatters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>日志记录最终是需要以文本来呈现的。Formatter 描述了文本的格式。一个 formatter 通常由包含 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logrecord-attributes\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">LogRecord attributes</span></a> 的 Python 格式化字符串组成，不过你也可以为特定的格式来配置自定义的 formatter。</p>\n</section>\n</section>\n</section>\n<section id=\"using-logging\">\n<h2>使用 logging 模块<a class=\"heading-anchor\" href=\"#using-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\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=\"c1\"># import the logging library</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n\n<span class=\"c1\"># Get an instance of a logger</span>\nlogger <span class=\"o\">=</span> logging<span class=\"o\">.</span>getLogger<span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">,</span> arg1<span class=\"p\">,</span> arg<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">if</span> bad_mojo<span class=\"p\">:</span>\n        <span class=\"c1\"># Log an error message</span>\n        logger<span class=\"o\">.</span>error<span class=\"p\">(</span><span class=\"s1\">&#39;Something went wrong!&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>就这么简单！<code class=\"docutils literal notranslate\">bad_mojo</code> 条件每次满足都会写一条 error 日志。</p>\n<section id=\"naming-loggers\">\n<h3>为 logger 命名<a class=\"heading-anchor\" href=\"#naming-loggers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>对 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.getLogger\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">logging.getLogger()</code></a> 的调用会获取（必要时会创建）一个 logger 的实例。不同的 logger 实例用名字来区分。这个名字是为了在配置的时候指定 logger。</p>\n<p>按照惯例，logger 的名字通常是包含该 logger 的 Python 模块名，即  <code class=\"docutils literal notranslate\">__name__</code>。这样可以基于模块来过滤和处理日志请求。不过，如果你有其他的方式来组织你的日志消息，可以为 logger 提供点号分割的名字来标识它：</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=\"c1\"># Get an instance of a specific named logger</span>\nlogger <span class=\"o\">=</span> logging<span class=\"o\">.</span>getLogger<span class=\"p\">(</span><span class=\"s1\">&#39;project.interesting.stuff&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这种 logger 的名字，用点号分隔的路径定义了一种层次结构。<code class=\"docutils literal notranslate\">project.interesting</code> 这个 logger 是 <code class=\"docutils literal notranslate\">project.interesting.stuff</code> logger 的上级；而 <code class=\"docutils literal notranslate\">project</code> logger 是 <code class=\"docutils literal notranslate\">project.interesting</code> logger 的上级。</p>\n<p>为什么层次结构很重要？嗯，因为记录器可以被设置为将其记录调用 <em>传播</em> 到其父级。通过这种方式，你可以在记录器树的根部定义一组处理程序，并捕获记录器子树中的所有记录调用。在 <code class=\"docutils literal notranslate\">project</code> 命名空间中定义的日志记录器将捕获在 <code class=\"docutils literal notranslate\">project.interest</code> 和 <code class=\"docutils literal notranslate\">project.interest.stuff</code> 日志记录器上发出的所有日志记录消息。</p>\n<p>可以基于 logger 来控制传播的行为。 如果你不希望某个 logger 传播给上级，可以关闭它。</p>\n</section>\n<section id=\"making-logging-calls\">\n<h3>发起 logging 调用<a class=\"heading-anchor\" href=\"#making-logging-calls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>logger 实例包含了每种默认日志级别的入口方法：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">logger.debug()</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">logger.info()</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">logger.warning()</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">logger.error()</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">logger.critical()</code></p></li>\n</ul>\n<p>还有两种其他的调用方法：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">logger.log()</code>：手动输出一条指定日志级别的日志消息。</p></li>\n<li><p><code class=\"docutils literal notranslate\">logger.exception()</code>：创建一个包含当前异常堆栈帧的 <code class=\"docutils literal notranslate\">ERROR</code> 级别日志消息。</p></li>\n</ul>\n</section>\n</section>\n<section id=\"configuring-logging\">\n<span id=\"id1\"></span><h2>日志模块的配置<a class=\"heading-anchor\" href=\"#configuring-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>仅仅在代码中加入日志调用是不够的。你还需要配置日志记录器、处理程序、过滤器和格式化程序，以确保你能使用日志输出。</p>\n<p>Python 的日志库提供了一些配置方法，可以使用编程接口或者配置文件。Django默认使用 <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\">dictConfig format</span></a>。</p>\n<p>为了配置 logging ，用字典的格式定义一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> 配置项，这些配置描述了你想要的 logger、handler、filter 和 formatter，以及它们的日志级别和其他你想要的属性。</p>\n<p>默认情况下 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> 配置和 <a class=\"reference internal\" href=\"#default-logging-configuration\"><span class=\"std std-ref\">Django 默认日志配置</span></a>  按照下面的方式合并在一起：</p>\n<p>如果 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> dictConfig 中的 <code class=\"docutils literal notranslate\">disable_existing_loggers</code> 键被设置为 <code class=\"docutils literal notranslate\">True</code> （如果该键缺失，则为 <code class=\"docutils literal notranslate\">dictConfig</code> 默认值），则默认配置中的所有记录器都将被禁用。禁用的记录器与删除的记录器不同；记录器仍将存在，但会默默地丢弃任何记录到它的内容，甚至不会将条目传播到父记录仪。因此，你应该非常小心地使用 <code class=\"docutils literal notranslate\">'disable_existing_loggers': True</code>；这可能不是你想要的。相反，你可以将 <code class=\"docutils literal notranslate\">disable_existing_loggers</code> 设置为 <code class=\"docutils literal notranslate\">False</code>，然后重新定义一些或所有的默认日志记录器；或者你可以将 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> 设置为 <code class=\"docutils literal notranslate\">None</code>，然后 <a class=\"reference internal\" href=\"#disabling-logging-configuration\"><span class=\"std std-ref\">自己处理日志配置</span></a>。</p>\n<p>logging 被配置成了 Django  <code class=\"docutils literal notranslate\">setup()</code> 函数的一部分。因此，你可以确定的是，logger 一直都可以在项目代码里使用。</p>\n<section id=\"examples\">\n<h3>示例<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><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\">dictConfig format</span></a> 文档是获取日志配置细节的最好资料。不过，为了让你知道能做什么，下面有几个例子。</p>\n<p>首先，这里有一个小配置，可以让你把所有的日志信息输出到控制台。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">import</span> <span class=\"nn\">os</span>\n\nLOGGING <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;version&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;disable_existing_loggers&#39;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;console&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;logging.StreamHandler&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;root&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;console&#39;</span><span class=\"p\">],</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;WARNING&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>这将配置父 <code class=\"docutils literal notranslate\">root</code> 记录器，以向控制台处理程序发送 <code class=\"docutils literal notranslate\">WARNING</code> 级别及以上的消息。通过将级别调整为 <code class=\"docutils literal notranslate\">INFO</code> 或 <code class=\"docutils literal notranslate\">DEBUG</code>，可以显示更多的消息。这在开发过程中可能很有用。</p>\n<p>接下来我们可以添加更多细粒度的日志记录。下面是一个例子，说明如何让日志系统只从名为 logger 的 <a class=\"reference internal\" href=\"#django-logger\"><span class=\"std std-ref\">django</span></a> 中打印更多的消息。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">import</span> <span class=\"nn\">os</span>\n\nLOGGING <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;version&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;disable_existing_loggers&#39;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;console&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;logging.StreamHandler&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;root&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;console&#39;</span><span class=\"p\">],</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;WARNING&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;loggers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;console&#39;</span><span class=\"p\">],</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> os<span class=\"o\">.</span>getenv<span class=\"p\">(</span><span class=\"s1\">&#39;DJANGO_LOG_LEVEL&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;INFO&#39;</span><span class=\"p\">),</span>\n            <span class=\"s1\">&#39;propagate&#39;</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></figure>\n<p>默认情况下，这个配置会从 <code class=\"docutils literal notranslate\">django</code> 的日志记录器中发送级别为 <code class=\"docutils literal notranslate\">INFO</code> 或更高的消息到控制台。这个级别和 Django 的默认日志配置是一样的，只是默认配置只在 <code class=\"docutils literal notranslate\">DEBUG=True</code> 时才显示日志记录。Django 不会记录很多这样的 <code class=\"docutils literal notranslate\">INFO</code> 级别的消息。不过，有了这个配置，你也可以设置环境变量 <code class=\"docutils literal notranslate\">DJANGO_LOG_LEVEL=DEBUG</code> 来查看 Django 所有的调试日志，因为它包括了所有的数据库查询，所以非常啰嗦。</p>\n<p>你不需要把日志记录到控制台。下面是一个配置，它将所有来自 <a class=\"reference internal\" href=\"#django-logger\"><span class=\"std std-ref\">django</span></a> 命名的记录器的日志记录写入本地文件。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code>LOGGING <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;version&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;disable_existing_loggers&#39;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;file&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;DEBUG&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;logging.FileHandler&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;filename&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;/path/to/django/debug.log&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;loggers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">],</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;DEBUG&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;propagate&#39;</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<span class=\"p\">}</span>\n</code></pre></figure>\n<p>若你使用此例子，切记要将 <code class=\"docutils literal notranslate\">'filename'</code> 指向的路径改为当前运行 Django 应用的用户可写的路径。</p>\n<p>最后，这里是一个相当复杂的日志设置的例子。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code>LOGGING <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;version&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;disable_existing_loggers&#39;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;formatters&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;verbose&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;format&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;</span><span class=\"si\">{levelname}</span><span class=\"s1\"> </span><span class=\"si\">{asctime}</span><span class=\"s1\"> </span><span class=\"si\">{module}</span><span class=\"s1\"> </span><span class=\"si\">{process:d}</span><span class=\"s1\"> </span><span class=\"si\">{thread:d}</span><span class=\"s1\"> </span><span class=\"si\">{message}</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;style&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;{&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s1\">&#39;simple&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;format&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;</span><span class=\"si\">{levelname}</span><span class=\"s1\"> </span><span class=\"si\">{message}</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;style&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;{&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;special&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;()&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;project.logging.SpecialFilter&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s1\">&#39;require_debug_true&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;()&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.RequireDebugTrue&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;console&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;INFO&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;require_debug_true&#39;</span><span class=\"p\">],</span>\n            <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;logging.StreamHandler&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;formatter&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;simple&#39;</span>\n        <span class=\"p\">},</span>\n        <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.AdminEmailHandler&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;special&#39;</span><span class=\"p\">]</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;loggers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;console&#39;</span><span class=\"p\">],</span>\n            <span class=\"s1\">&#39;propagate&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s1\">&#39;django.request&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">],</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;propagate&#39;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s1\">&#39;myproject.custom&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;console&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">],</span>\n            <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;INFO&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;special&#39;</span><span class=\"p\">]</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>该日志配置做了以下事情：</p>\n<ul>\n<li><p>识别配置为 'dictConfig 版本 1' 格式。目前，这是唯一的 dictConfig 格式版本。</p></li>\n<li><p>定义两个格式化程序：</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">simple</code>，输出日志级别名称（如 <code class=\"docutils literal notranslate\">DEBUG</code>）和日志信息。</p>\n<p><code class=\"docutils literal notranslate\">format</code> 字符串是一个普通的 Python 格式化字符串，它描述了每个日志行要输出的细节。可以输出的完整细节列表可以在 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#formatter-objects\" title=\"(in Python v3.14)\"><span>Formatter Objects</span></a> 中找到。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">verbose</code>，输出日志级别名称、日志信息，以及生成日志信息的时间、进程、线程和模块。</p></li>\n</ul>\n</li>\n<li><p>定义两个过滤器：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">project.logging.SpecialFilter</code>，使用别名 <code class=\"docutils literal notranslate\">special</code>。如果这个过滤器需要额外的参数，它们可以作为过滤器配置字典中的附加键提供。在这种情况下，当实例化 <code class=\"docutils literal notranslate\">SpecialFilter</code> 时，参数 <code class=\"docutils literal notranslate\">foo</code> 将被赋予一个 <code class=\"docutils literal notranslate\">bar</code> 的值。</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.utils.log.RequireDebugTrue</code>，当 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，传递记录。</p></li>\n</ul>\n</li>\n<li><p>定义两个处理程序：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">console</code>，一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#logging.StreamHandler\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">StreamHandler</code></a>，它将任何 <code class=\"docutils literal notranslate\">INFO</code> （或更高）消息打印到 <code class=\"docutils literal notranslate\">sys.stderr</code>。该处理程序使用 <code class=\"docutils literal notranslate\">simple</code> 输出格式。</p></li>\n<li><p><code class=\"docutils literal notranslate\">mail_admins</code>，一个 <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\">AdminEmailHandler</code></a>，它向网站 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\">ADMINS</code></a> 发送任何 <code class=\"docutils literal notranslate\">ERROR</code> （或更高）消息。该处理程序使用 <code class=\"docutils literal notranslate\">special</code> 过滤器。</p></li>\n</ul>\n</li>\n<li><p>配置三个记录器。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">django</code>，将所有信息传递给 <code class=\"docutils literal notranslate\">console</code> 处理程序。</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.request</code>，它将所有 <code class=\"docutils literal notranslate\">ERROR</code> 消息传递给 <code class=\"docutils literal notranslate\">mail_admins</code> 处理程序。此外，这个记录器被标记为 <em>不</em> 传播消息。这意味着写给 <code class=\"docutils literal notranslate\">django.request</code> 的日志信息不会被 <code class=\"docutils literal notranslate\">django</code> 日志处理程序处理。</p></li>\n<li><p><code class=\"docutils literal notranslate\">myproject.custom</code>，它将所有 <code class=\"docutils literal notranslate\">INFO</code> 或更高等级的消息传递给两个处理程序——<code class=\"docutils literal notranslate\">console</code> 和 <code class=\"docutils literal notranslate\">mail_admins</code>。这意味着所有 <code class=\"docutils literal notranslate\">INFO</code> 级别（或更高）的消息将被打印到控制台；<code class=\"docutils literal notranslate\">ERROR</code> 和 <code class=\"docutils literal notranslate\">CRITICAL</code> 消息也将通过电子邮件输出。</p></li>\n</ul>\n</li>\n</ul>\n</section>\n<section id=\"custom-logging-configuration\">\n<h3>自定义日志记录配置<a class=\"heading-anchor\" href=\"#custom-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你不想使用 Python 的 dictConfig 格式来配置记录器，你可以指定自己的配置方案。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> 设置定义了用于配置 Django 日志记录器的可调用对象，默认情况下，它指向 Python 的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">logging.config.dictConfig()</code></a> 函数。然而，如果你想使用不同的配置过程，你可以使用其他任何一个接受单一参数的可调用。当配置日志时， <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> 的内容将作为该参数的值提供。</p>\n</section>\n<section id=\"disabling-logging-configuration\">\n<span id=\"id2\"></span><h3>禁用日志记录配置<a class=\"heading-anchor\" href=\"#disabling-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你根本不想配置日志记录（或者你想用自己的方法手动配置日志记录），你可以将 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> 设置为 <code class=\"docutils literal notranslate\">None</code>。这将禁用 <a class=\"reference internal\" href=\"#default-logging-configuration\"><span class=\"std std-ref\">Django 的默认日志记录</span></a> 的配置过程。</p>\n<p>将 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> 设置为 <code class=\"docutils literal notranslate\">None</code> 只是意味着自动配置过程被禁用，而不是日志本身。如果你禁用了配置过程，Django 仍然会进行日志调用，回到默认的日志行为。</p>\n<p>下面是一个禁用 Django 的日志配置，然后手动配置日志的例子。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code>LOGGING_CONFIG <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">logging.config</span>\nlogging<span class=\"o\">.</span>config<span class=\"o\">.</span>dictConfig<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>请注意，默认的配置过程只有在设置完全加载后才会调用 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a>。相反，在设置文件中手动配置日志记录将立即加载你的日志记录配置。因此，你的日志配置必须出现在它所依赖的任何设置之后。</p>\n</section>\n</section>\n<section id=\"django-s-logging-extensions\">\n<h2>Django 的日志记录扩展<a class=\"heading-anchor\" href=\"#django-s-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=\"id3\">\n<h3>Loggers<a class=\"heading-anchor\" href=\"#id3\"><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\">django</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\">django</code> 层次结构中消息的总记录器。不使用该名称发布消息，而是使用以下记录器之一。</p>\n</section>\n<section id=\"django-request\">\n<span id=\"django-request-logger\"></span><h4><code class=\"docutils literal notranslate\">django.request</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\">ERROR</code> 消息的形式出现；4XX 的响应以 <code class=\"docutils literal notranslate\">WARNING</code> 消息的形式出现。记录在 <code class=\"docutils literal notranslate\">django.security</code> 记录器中的请求不会记录在 <code class=\"docutils literal notranslate\">django.request</code> 中。</p>\n<p>发送给此记录器的消息有以下额外的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">status_code</code>：与请求相关的 HTTP 响应代码。</p></li>\n<li><p><code class=\"docutils literal notranslate\">request</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\">django.server</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/3.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a> 命令调用的服务器收到的请求有关的消息。HTTP 5XX 响应被记录为 <code class=\"docutils literal notranslate\">ERROR</code> 消息，4XX 响应被记录为 <code class=\"docutils literal notranslate\">WARNING</code> 消息，其他所有消息被记录为 <code class=\"docutils literal notranslate\">INFO</code>。</p>\n<p>发送给此记录器的消息有以下额外的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">status_code</code>：与请求相关的 HTTP 响应代码。</p></li>\n<li><p><code class=\"docutils literal notranslate\">request</code>：产生记录信息的请求对象。</p></li>\n</ul>\n</section>\n<section id=\"django-template\">\n<span id=\"django-template-logger\"></span><h4><code class=\"docutils literal notranslate\">django.template</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\">DEBUG</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\">django.db.backends</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\">DEBUG</code> 级别记录到这个记录器。</p>\n<p>发送给此记录器的消息有以下额外的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">duration</code>：执行 SQL 语句所需时间。</p></li>\n<li><p><code class=\"docutils literal notranslate\">sql</code>：所执行的 SQL 语句。</p></li>\n<li><p><code class=\"docutils literal notranslate\">params</code>：SQL 调用中使用的参数。</p></li>\n</ul>\n<p>出于性能考虑，只有当 <code class=\"docutils literal notranslate\">settings.DEBUG</code> 设置为 <code class=\"docutils literal notranslate\">True</code> 时，才会启用 SQL 日志记录，而不考虑日志级别或安装的处理程序。</p>\n<p>该日志不包括框架级初始化（如 <code class=\"docutils literal notranslate\">SET TIMEZONE</code>）或事务管理查询（如 <code class=\"docutils literal notranslate\">BEGIN</code>、<code class=\"docutils literal notranslate\">COMMIT</code> 和 <code class=\"docutils literal notranslate\">ROLLBACK</code>）。如果想查看所有数据库查询，请在数据库中开启查询记录。</p>\n</section>\n<section id=\"django-security\">\n<span id=\"django-security-logger\"></span><h4><code class=\"docutils literal notranslate\">django.security.*</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>安全记录器将接收任何发生 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\">SuspiciousOperation</code></a> 和其他安全相关错误的消息。每个子类型的安全错误都有一个子记录器，包括所有 <code class=\"docutils literal notranslate\">SuspiciousOperation</code>s。日志事件的级别取决于异常处理的位置。 大多数发生的事件被记录为警告，而任何到达 WSGI 处理程序的 <code class=\"docutils literal notranslate\">SuspiciousOperation</code> 将被记录为错误。例如，当客户端的请求中包含一个 HTTP <code class=\"docutils literal notranslate\">Host</code> 头，而这个头不符合 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\">ALLOWED_HOSTS</code></a> 时，Django 会返回一个 400 的响应，并且错误信息会被记录到 <code class=\"docutils literal notranslate\">django.security.DisallowedHost</code> 记录器中。</p>\n<p>这些日志事件默认会到达 <code class=\"docutils literal notranslate\">django</code> 日志器，当 <code class=\"docutils literal notranslate\">DEBUG=False</code> 时，记录器会将错误事件发送给管理员。由于 <code class=\"docutils literal notranslate\">SuspiciousOperation</code> 导致 400 响应的请求不会被记录到 <code class=\"docutils literal notranslate\">django.request</code> 记录器，而只会记录到 <code class=\"docutils literal notranslate\">django.security</code> 记录器。</p>\n<p>要使某一特定类型的 <code class=\"docutils literal notranslate\">SuspiciousOperation</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=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;null&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;logging.NullHandler&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">},</span>\n<span class=\"s1\">&#39;loggers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;django.security.DisallowedHost&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;null&#39;</span><span class=\"p\">],</span>\n        <span class=\"s1\">&#39;propagate&#39;</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</code></pre></div>\n<p>其他不基于 <code class=\"docutils literal notranslate\">SuspiciousOperation</code> 的 <code class=\"docutils literal notranslate\">django.security</code> 记录器是：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">django.security.csrf</code>：用于 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/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\">django.db.backends.schema</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/3.1/topics/migrations/\"><span class=\"doc\">migrations framework</span></a> 对数据库进行模式变更时执行的 SQL 查询。请注意，它不会记录 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> 执行的查询。给这个记录器的消息在其额外的上下文中有 <code class=\"docutils literal notranslate\">params</code> 和 <code class=\"docutils literal notranslate\">sql</code> （但与 <code class=\"docutils literal notranslate\">django.db.backends</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>\n<section id=\"id4\">\n<h3>Handlers<a class=\"heading-anchor\" href=\"#id4\"><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\">class</span> </em><span class=\"sig-name descname\">AdminEmailHandler</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">include_html<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">email_backend<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">reporter_class<span class=\"o\">=</span><span class=\"default_value\">None</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/3.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\">ADMINS</code></a> 发送一封邮件。</p>\n<p>如果日志记录中包含 <code class=\"docutils literal notranslate\">request</code> 属性，电子邮件中会包含请求的全部细节。如果客户的 IP 地址在 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-INTERNAL_IPS\"><code class=\"xref std std-setting docutils literal notranslate\">INTERNAL_IPS</code></a> 设置中，电子邮件主题将包括“内部 IP”；如果没有，则包括“外部 IP”。</p>\n<p>如果日志记录中包含堆栈跟踪信息，该堆栈跟踪信息将包含在电子邮件中。</p>\n<p><code class=\"docutils literal notranslate\">AdminEmailHandler</code> 的 <code class=\"docutils literal notranslate\">include_html</code> 参数用于控制回溯邮件是否包含一个 HTML 附件，该附件包含调试网页的完整内容，如果 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 的话，该附件将被生成。要在你的配置中设置这个值，请在 <code class=\"docutils literal notranslate\">django.utils.log.AdminEmailHandler</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=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.AdminEmailHandler&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;include_html&#39;</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>请注意，这封 HTML 版本的邮件包含了完整的跟踪信息，包括堆栈中每一层的本地变量的名称和值，以及你的Django设置值。这些信息可能非常敏感，你可能不想通过邮件发送。可以考虑使用诸如 <a class=\"reference external\" href=\"https://pypi.org/project/sentry/\">Sentry</a>  这样的软件来获得两全其美的效果--既能获得丰富的信息，又能保证不通过邮件发送信息的安全性。你也可以明确指定某些敏感信息从错误报告中过滤出来——在 <a class=\"reference internal\" href=\"/zh-hans/3.1/howto/error-reporting/#filtering-error-reports\"><span class=\"std std-ref\">过滤错误报告</span></a> 中了解更多信息。</p>\n<p>通过设置 <code class=\"docutils literal notranslate\">AdminEmailHandler</code> 的 <code class=\"docutils literal notranslate\">email_backend</code> 参数，处理程序使用的 <a class=\"reference internal\" href=\"/zh-hans/3.1/topics/email/#topic-email-backends\"><span class=\"std std-ref\">email 后端</span></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=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.AdminEmailHandler&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;email_backend&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.mail.backends.filebased.EmailBackend&#39;</span><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/3.1/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_BACKEND</code></a> 中指定的电子邮件后端实例。</p>\n<p><code class=\"docutils literal notranslate\">AdminEmailHandler</code> 的 <code class=\"docutils literal notranslate\">reporter_class</code> 参数允许提供一个 <code class=\"docutils literal notranslate\">django.view.debug.ExceptionReporter</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=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.AdminEmailHandler&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;include_html&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;reporter_class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;somepackage.error_reporter.CustomErrorReporter&#39;</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">},</span>\n</code></pre></div>\n<aside class=\"version-note version-added\" data-version=\"3.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.0</p><p>增加了 <code class=\"docutils literal notranslate\">reporter_class</code> 参数。</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\">send_mail</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">subject</em>, <em class=\"sig-param\">message</em>, <em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</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\">AdminEmailHandler</code></a> 类子类化，并覆盖这个方法。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"id5\">\n<h3>过滤器<a class=\"heading-anchor\" href=\"#id5\"><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\">class</span> </em><span class=\"sig-name descname\">CallbackFilter</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">callback</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/3.1/ref/exceptions/#django.http.UnreadablePostError\" title=\"django.http.UnreadablePostError\"><code class=\"xref py py-exc docutils literal notranslate\">UnreadablePostError</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=\"nn\">django.http</span> <span class=\"kn\">import</span> UnreadablePostError\n\n<span class=\"k\">def</span> <span class=\"nf\">skip_unreadable_post</span><span class=\"p\">(</span>record<span class=\"p\">):</span>\n    <span class=\"k\">if</span> record<span class=\"o\">.</span>exc_info<span class=\"p\">:</span>\n        exc_type<span class=\"p\">,</span> exc_value <span class=\"o\">=</span> record<span class=\"o\">.</span>exc_info<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>exc_value<span class=\"p\">,</span> UnreadablePostError<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=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;skip_unreadable_posts&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;()&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.CallbackFilter&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;callback&#39;</span><span class=\"p\">:</span> skip_unreadable_post<span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">},</span>\n<span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;skip_unreadable_posts&#39;</span><span class=\"p\">],</span>\n        <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.AdminEmailHandler&#39;</span>\n    <span class=\"p\">}</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\">class</span> </em><span class=\"sig-name descname\">RequireDebugFalse</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\">logging</code> 配置中使用如下，以确保 <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\">AdminEmailHandler</code></a> 只在 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 为 <code class=\"docutils literal notranslate\">False</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=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;require_debug_false&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;()&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.RequireDebugFalse&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">},</span>\n<span class=\"s1\">&#39;handlers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;mail_admins&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;level&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;ERROR&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;filters&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;require_debug_false&#39;</span><span class=\"p\">],</span>\n        <span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.utils.log.AdminEmailHandler&#39;</span>\n    <span class=\"p\">}</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\">class</span> </em><span class=\"sig-name descname\">RequireDebugTrue</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\">RequireDebugFalse</code></a>，但只有当 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时才会传递记录。</p>\n</dd></dl>\n\n</section>\n</section>\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 配置了以下日志：</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">django</code> 记录器将 <code class=\"docutils literal notranslate\">django</code> 层次结构（<code class=\"docutils literal notranslate\">django.server</code> 除外）中的 <code class=\"docutils literal notranslate\">INFO</code> 级别或更高的消息发送到控制台。</p></li>\n</ul>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 为 <code class=\"docutils literal notranslate\">False</code> 时：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">django</code> 记录器将 <code class=\"docutils literal notranslate\">django</code> 层次结构（<code class=\"docutils literal notranslate\">django.server</code> 除外）中带有 <code class=\"docutils literal notranslate\">ERROR</code> 或 <code class=\"docutils literal notranslate\">CRITICAL</code> 级别的消息发送到 <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\">AdminEmailHandler</code></a>。</p></li>\n</ul>\n<p>与 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</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\">INFO</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\">django</code> 的根日志记录器。<code class=\"docutils literal notranslate\">console</code> 和 <code class=\"docutils literal notranslate\">mail_admins</code> 处理程序被附加到根记录器上，以提供上述行为。</p>\n<p>还请参见 <a class=\"reference internal\" href=\"#configuring-logging\"><span class=\"std std-ref\">配置日志</span></a> 了解如何补充或替换 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/3.1.x/django/utils/log.py\">django/utils/log.py</a> 中定义的默认日志配置。</p>\n</section>","rootId":"module-django.utils.log","toc":[{"title":"日志管理快速入门","anchor":"a-quick-logging-primer","children":[{"title":"日志框架的组成元素","anchor":"the-cast-of-players","children":[{"title":"Loggers","anchor":"loggers","children":[]},{"title":"Handlers","anchor":"handlers","children":[]},{"title":"过滤器","anchor":"filters","children":[]},{"title":"Formatters","anchor":"formatters","children":[]}]}]},{"title":"使用 logging 模块","anchor":"using-logging","children":[{"title":"为 logger 命名","anchor":"naming-loggers","children":[]},{"title":"发起 logging 调用","anchor":"making-logging-calls","children":[]}]},{"title":"日志模块的配置","anchor":"configuring-logging","children":[{"title":"示例","anchor":"examples","children":[]},{"title":"自定义日志记录配置","anchor":"custom-logging-configuration","children":[]},{"title":"禁用日志记录配置","anchor":"disabling-logging-configuration","children":[]}]},{"title":"Django 的日志记录扩展","anchor":"django-s-logging-extensions","children":[{"title":"Loggers","anchor":"id3","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.security.*","anchor":"django-security","children":[]},{"title":"django.db.backends.schema","anchor":"django-db-backends-schema","children":[]}]},{"title":"Handlers","anchor":"id4","children":[]},{"title":"过滤器","anchor":"id5","children":[]}]},{"title":"Django 的默认日志配置","anchor":"django-s-default-logging-configuration","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"使用 Django","url":"/zh-hans/3.1/topics/"}],"prev":{"docname":"topics/i18n/timezones","title":"Time zones","url":"/zh-hans/3.1/topics/i18n/timezones/"},"next":{"docname":"topics/pagination","title":"分页","url":"/zh-hans/3.1/topics/pagination/"},"formats":{"html":"/zh-hans/3.1/topics/logging/","markdown":"/zh-hans/3.1/topics/logging.md","json":"/zh-hans/3.1/topics/logging.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/logging.txt","official":"https://docs.djangoproject.com/zh-hans/3.1/topics/logging/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}