{"title":"如何配置和使用日志","version":"5.2","locale":"zh-hans","docname":"howto/logging","url":"/zh-hans/5.2/howto/logging/","canonical":"https://djangodocs.dev/zh-hans/5.2/howto/logging/","summary":"See also Django 日志参考 Django 日志概览 Django 提供了一个可扩展的 默认日志配置 。 发起基本的 logging 调用 Link to this heading # 要从代码中发送日志消息，你需要在代码中添加日志调用。 不要在 settings.py 中使用日志调用。 Django 日志配置作为…","html":"<span id=\"logging-how-to\"></span><h1>如何配置和使用日志<a class=\"heading-anchor\" href=\"#how-to-configure-and-use-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/5.2/ref/logging/#logging-ref\"><span class=\"std std-ref\">Django 日志参考</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/topics/logging/#logging-explanation\"><span class=\"std std-ref\">Django 日志概览</span></a></p></li>\n</ul>\n</aside>\n<p>Django 提供了一个可扩展的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/logging/#default-logging-configuration\"><span class=\"std std-ref\">默认日志配置</span></a>。</p>\n<section id=\"make-a-basic-logging-call\">\n<h2>发起基本的 logging 调用<a class=\"heading-anchor\" href=\"#make-a-basic-logging-call\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>要从代码中发送日志消息，你需要在代码中添加日志调用。</p>\n<aside class=\"admonition-don-t-be-tempted-to-use-logging-calls-in-settings-py admonition\">\n<p class=\"admonition-title\">不要在 <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> 中使用日志调用。</p>\n<p>Django 日志配置作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> 函数的一部分配置的方式意味着在 <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> 中放置的日志调用可能不会按预期工作，因为在那个时候 <em>日志还没有设置好</em>。要探索日志，请使用下面示例中建议的视图函数。</p>\n</aside>\n<p>首先，导入Python的日志库，然后使用 <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\"><span class=\"pre\">logging.getLogger()</span></code></a> 获取一个日志记录器实例。为 <code class=\"docutils literal notranslate\"><span class=\"pre\">getLogger()</span></code> 方法提供一个用于识别它和它发出的记录的名称。一个好的选择是使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code> （参见下面的 <span class=\"xref std std-ref\">命名日志记录器</span> 了解更多信息），它将提供当前Python模块的名称作为一个点分路径：</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\">import</span><span class=\"w\"> </span><span class=\"nn\">logging</span>\n\n<span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在模块级别执行此声明是一个好的约定。</p>\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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">if</span> <span class=\"n\">some_risky_state</span><span class=\"p\">:</span>\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s2\">&quot;Platform is running at risk&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>当执行此代码时，将发送一个包含该消息的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> 到日志记录器。如果你正在使用 Django 的默认日志配置，该消息将出现在控制台中。</p>\n<p>上面示例中使用的 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 级别是多个 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/logging/#topic-logging-parts-loggers\"><span class=\"std std-ref\">日志严重级别</span></a> 中的一个：<code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</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\">logger</span><span class=\"o\">.</span><span class=\"n\">critical</span><span class=\"p\">(</span><span class=\"s2\">&quot;Payment system is not responding&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-important\">\n<p class=\"admonition-title\">Important</p>\n<p>级别低于 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 的记录默认情况下不会出现在控制台中。要更改此行为，需要额外的配置。</p>\n</aside>\n</section>\n<section id=\"customize-logging-configuration\">\n<h2>自定义日志配置<a class=\"heading-anchor\" href=\"#customize-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>虽然 Django 的日志配置可以直接使用，但您可以通过一些额外的配置来精确控制日志发送到各种目标的方式，如日志文件、外部服务、电子邮件等。</p>\n<p>你可以配置：</p>\n<ul class=\"simple\">\n<li><p>使用日志记录器映射来确定将哪些记录发送到哪些处理程序。</p></li>\n<li><p>使用处理程序来确定它们接收到的记录的处理方式</p></li>\n<li><p>使用过滤器来对记录的传递进行额外控制，甚至可以对记录进行原地修改</p></li>\n<li><p>格式化器，用于将 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> 对象转换为字符串或其他形式，以供人类或其他系统使用。</p></li>\n</ul>\n<p>有各种配置日志的方式。在Django中，最常用的是 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> 设置。该设置使用 <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 格式</span></a>，并扩展了 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/logging/#default-logging-definition\"><span class=\"std std-ref\">默认的日志配置</span></a>。</p>\n<p>请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/logging/#configuring-logging\"><span class=\"std std-ref\">日志模块的配置</span></a> 以了解如何将你的自定义设置与 Django 的默认设置合并的解释。</p>\n<p>有关其他配置日志的方式的详细信息，请参阅 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#module-logging.config\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">Python</span> <span class=\"pre\">日志文档</span></code></a>。为了简单起见，本文档将仅考虑通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code> 设置进行配置。</p>\n<section id=\"basic-logging-configuration\">\n<span id=\"basic-logger-configuration\"></span><h3>基础日志配置<a class=\"heading-anchor\" href=\"#basic-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在配置日志时，以下操作是有意义的</p>\n<section id=\"create-a-logging-dictionary\">\n<h4>创建一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code> 目录<a class=\"heading-anchor\" href=\"#create-a-logging-dictionary\"><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\">settings.py</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=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>  <span class=\"c1\"># the dictConfig format version</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>  <span class=\"c1\"># retain the default loggers</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>通常情况下，将 <code class=\"docutils literal notranslate\"><span class=\"pre\">disable_existing_loggers</span></code> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>，保留并扩展默认的日志配置是有意义的。</p>\n</section>\n<section id=\"configure-a-handler\">\n<h4>配置一个处理程序<a class=\"heading-anchor\" href=\"#configure-a-handler\"><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\">file</span></code> 的处理程序，使用Python的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#logging.FileHandler\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileHandler</span></code></a> 将级别为 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 及更高的日志保存到文件 <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> （位于项目根目录）中：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;file&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>不同的处理程序类接受不同的配置选项。有关可用处理程序类的更多信息，请参阅 Django 提供的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/logging/#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> 以及 Python 提供的各种 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#module-logging.handlers\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">处理程序类</span></code></a>。</p>\n<p>日志级别也可以在处理程序上进行设置（默认情况下，它们接受所有级别的日志消息）。使用上面的示例，添加以下内容：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"p\">{</span>\n    <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>可以定义一个处理程序配置，该配置只接受级别为 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 及更高级别的记录。</p>\n</section>\n<section id=\"configure-a-logger-mapping\">\n<h4>配置一个日志记录器映射<a class=\"heading-anchor\" href=\"#configure-a-logger-mapping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>要将记录发送到该处理程序，请配置一个日志记录器映射，例如：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;file&quot;</span><span class=\"p\">],</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>映射的名称决定了它将处理哪些日志记录。此配置（<code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code>）是 <em>无名称</em> 的。这意味着它将处理 <em>所有</em> 记录器的记录（请参阅下面的 <span class=\"xref std std-ref\">命名记录器</span> 以了解如何使用映射名称来确定它将处理哪些记录器的记录）。</p>\n<p>它将级别为 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 及更高的消息发送给名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">file</span></code> 的处理程序。</p>\n<p>请注意，一个日志记录器可以将消息转发给多个处理程序，因此日志记录器和处理程序之间的关系是多对多的。</p>\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\">logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attempting to connect to API&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在你的代码中，你将在项目根目录中的文件 <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> 中找到该消息。</p>\n</section>\n<section id=\"configure-a-formatter\">\n<h4>配置格式化器<a class=\"heading-anchor\" href=\"#configure-a-formatter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>默认情况下，最终的日志输出包含每个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">日志记录</span></code></a> 的消息部分。如果想要包含附加数据，可以使用格式化器。首先命名并定义你的格式化器 - 以下示例定义了名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">simple</span></code> 的格式化器：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;formatters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{name}</span><span class=\"s2\"> </span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{asctime}</span><span class=\"s2\"> </span><span class=\"si\">{module}</span><span class=\"s2\"> </span><span class=\"si\">{process:d}</span><span class=\"s2\"> </span><span class=\"si\">{thread:d}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;simple&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">style</span></code> 关键字允许你指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">{</span></code> 用于 <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">$</span></code> 用于 <a class=\"reference external\" href=\"https://docs.python.org/3/library/string.html#string.Template\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">string.Template</span></code></a> 格式化；默认值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">$</span></code>。</p>\n<p>查看 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logrecord-attributes\" title=\"(in Python v3.14)\"><span>LogRecord attributes</span></a> 以了解可以包含的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> 属性。</p>\n<p>要将格式化器应用到处理程序，可以在处理程序的字典中添加一个指向格式化器的名称的 <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> 条目，例如：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;file&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.FileHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;formatter&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">,</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"use-logger-namespacing\">\n<span id=\"naming-loggers\"></span><h4>使用命名空间日志记录器<a class=\"heading-anchor\" href=\"#use-logger-namespacing\"><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\">''</span></code> 捕获来自任何 Python 应用程序的日志。命名的日志配置将仅捕获名称匹配的记录器的日志。</p>\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\"><span class=\"pre\">getLogger()</span></code></a> 定义的。例如，在 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</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\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>将在 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 命名空间中创建一个日志记录器。<code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code> 允许你自动根据项目中应用程序的来源组织日志消息。它还确保你不会遇到名称冲突。</p>\n<p>一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 的日志记录器映射将捕获来自这个记录器的记录：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;my_app.views&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">},</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> 的日志记录器映射将更加宽松，捕获来自 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> 命名空间中任何地方的记录器（包括 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.utils</span></code> 等等）：</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;my_app&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">},</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</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\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"s2\">&quot;project.payment&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>并相应地设置日志记录器映射。</p>\n<section id=\"using-logger-hierarchies-and-propagation\">\n<span id=\"naming-loggers-hierarchy\"></span><h5>使用日志记录器层次结构和传播<a class=\"heading-anchor\" href=\"#using-logger-hierarchies-and-propagation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>日志记录器的命名是 <em>分层</em> 的。<code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 的父级，<code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> 的父级。除非另有说明，否则日志记录器映射将将它们处理的记录传播给它们的父级 - 来自 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> 命名空间中的记录器的记录将由 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 的映射处理。</p>\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;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;my_app&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;my_app.views&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;my_app.views.private&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</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><code class=\"docutils literal notranslate\"><span class=\"pre\">propagate</span></code> 默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>。在这个示例中，来自 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> 的日志不会被父级处理，但来自 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 的日志会被处理。</p>\n</section>\n</section>\n</section>\n<section id=\"configure-responsive-logging\">\n<h3>配置响应式日志记录<a class=\"heading-anchor\" href=\"#configure-responsive-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>当日志包含尽可能多的信息，而不是您不需要的信息时，日志是最有用的——需要多少取决于您正在做的事情。在调试时，您需要一定程度的信息，如果您不得不在生产环境中处理这些信息，那么这些信息将是多余的，而且毫无用处。</p>\n<p>您可以配置日志记录，以在需要时为您提供所需的详细程度。与手动更改配置以实现此目的不同，更好的方式是根据环境自动应用配置。</p>\n<p>例如，你可以在开发和测试环境中适当设置一个环境变量 <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_LOG_LEVEL</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;level&quot;</span><span class=\"p\">:</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getenv</span><span class=\"p\">(</span><span class=\"s2\">&quot;DJANGO_LOG_LEVEL&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;WARNING&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>因此，除非环境指定较低的日志级别，否则此配置将仅将严重性为 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 及以上的记录转发到其处理程序。</p>\n<p>配置中的其他选项（例如处理程序的 <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> 选项）可以以类似的方式进行管理。</p>\n</section>\n</section>","rootId":"how-to-configure-and-use-logging","toc":[{"title":"发起基本的 logging 调用","anchor":"make-a-basic-logging-call","children":[]},{"title":"自定义日志配置","anchor":"customize-logging-configuration","children":[{"title":"基础日志配置","anchor":"basic-logging-configuration","children":[{"title":"创建一个 LOGGING 目录","anchor":"create-a-logging-dictionary","children":[]},{"title":"配置一个处理程序","anchor":"configure-a-handler","children":[]},{"title":"配置一个日志记录器映射","anchor":"configure-a-logger-mapping","children":[]},{"title":"配置格式化器","anchor":"configure-a-formatter","children":[]},{"title":"使用命名空间日志记录器","anchor":"use-logger-namespacing","children":[{"title":"使用日志记录器层次结构和传播","anchor":"using-logger-hierarchies-and-propagation","children":[]}]}]},{"title":"配置响应式日志记录","anchor":"configure-responsive-logging","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"如何引导","url":"/zh-hans/5.2/howto/"}],"prev":{"docname":"howto/static-files/index","title":"如何管理静态文件（如图片、JavaScript、CSS）","url":"/zh-hans/5.2/howto/static-files/"},"next":{"docname":"howto/error-reporting","title":"如何管理错误报告","url":"/zh-hans/5.2/howto/error-reporting/"},"formats":{"html":"/zh-hans/5.2/howto/logging/","markdown":"/zh-hans/5.2/howto/logging.md","json":"/zh-hans/5.2/howto/logging.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/howto/logging.txt","official":"https://docs.djangoproject.com/zh-hans/5.2/howto/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"]}