{"title":"Logging","version":"2.1","locale":"pt-br","docname":"topics/logging","url":"/pt-br/2.1/topics/logging/","canonical":"https://djangodocs.dev/pt-br/2.1/topics/logging/","summary":"O Django usa o módulo logging da linguagem Python para realizar logs de sistema.","html":"<span id=\"logging\"></span><h1>Logging<a class=\"heading-anchor\" href=\"#module-django.utils.log\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"a-quick-logging-primer\">\n<h2>Uma breve introdução ao log de dados<a class=\"heading-anchor\" href=\"#a-quick-logging-primer\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O Django usa o módulo <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#module-logging\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">logging</code></a> da linguagem Python para realizar logs de sistema. A utilização desse módulo é discutida em detalhes na própria documentação do Python. Contudo, se você nunca usou o framework de logs do Python (ou mesmo que você tenha usado), aqui vai um breve resumo.</p>\n<section id=\"the-cast-of-players\">\n<h3>O elenco de jogadores<a class=\"heading-anchor\" href=\"#the-cast-of-players\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A configuração de logs do Python é composta por quatro partes:</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\">Manipuladores</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-filters\"><span class=\"std std-ref\">Filtros</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-formatters\"><span class=\"std std-ref\">Formatadores</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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>O logger é o ponto de entrada no sistema de logs. Cada logger é um balde nomeado para o qual mensagens podem ser escritas para serem processadas.</p>\n<p>O logger é configurado para possuir um <em>level de log</em>. Esse level descreve o grau de severidade das mensagens que o logger irá manipular. O Python define os seguintes leveis de log:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">DEBUG</code>: Informações de sistema de baixo nível para propósitos de depuração</p></li>\n<li><p><code class=\"docutils literal notranslate\">INFO</code>: Informações gerais de sistema</p></li>\n<li><p><code class=\"docutils literal notranslate\">WARNING</code>: Informações descrevendo a ocorrência de um pequeno problema</p></li>\n<li><p><code class=\"docutils literal notranslate\">ERROR</code>: Informações descrevendo a ocorrência de um problema grande.</p></li>\n<li><p><code class=\"docutils literal notranslate\">CRITICAL</code>: Informações descrevendo a ocorrência de um problema crítico.</p></li>\n</ul>\n<p>Cada mensagem que é escrita para o logger é um <em>Registro de Log</em>. Cada registro de log também tem um <em>level de log</em> indicando a gravidade de cada mensagem em específico. O registro de log pode conter também metadados úteis descrevendo o evento que está sendo logado. Isso pode incluir detalhes como um código de erro ou um “stack trace” ou “rastreamento de pilha” em português.</p>\n<p>Quando a mensagem é dada ao logger, o level de log da mensagem é comparado com o level de log do logger. Se o level de log da mensagem for igual ou maior que o level de log do próprio logger, a mensagem seguirá em diante para processamento. Caso contrário, a mensagem será ignorada.</p>\n<p>Se o logger determinar que a mensagem precisa ser processada, ela será passada para um <em>Handler</em>.</p>\n</section>\n<section id=\"handlers\">\n<span id=\"topic-logging-parts-handlers\"></span><h4>Manipuladores<a class=\"heading-anchor\" href=\"#handlers\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>O handler ou manipulador em português, é o motor que determina o que acontece com cada mensagem em um logger. Ele descreve o comportamento de um logger em particular, tais como escrever a mensagem na tela, em um arquivo, ou em um socket de rede.</p>\n<p>Assim como os loggers, os handlers também possuem um level de log. Se o level de um registro de log não for igual ou maior ao level do handler, o handler irá ignorar a mensagem.</p>\n<p>Cada logger pode ter múltiplos handlers, e cada handler pode ter um level de log diferente. Desta forma, é possível fornecer diferentes formas de notificação dependendo da importância da mensagem. Por exemplo, você pode instalar um handler que encaminha mensagens do tipo <code class=\"docutils literal notranslate\">ERROR</code> e <code class=\"docutils literal notranslate\">CRITICAL</code> para um serviço de paginação, enquanto que um segundo handler loga todas as mensagens (incluindo mensagens do tipo <code class=\"docutils literal notranslate\">ERROR</code> e <code class=\"docutils literal notranslate\">CRITICAL</code>) para um arquivo para análise posterior.</p>\n</section>\n<section id=\"filters\">\n<span id=\"topic-logging-parts-filters\"></span><h4>Filtros<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>O filter ou filtro em português, é usado para fornecer controle adicional sobre quais registros de logs serão passados do logger para o handler.</p>\n<p>Por padrão, qualquer mensagem de log que satisfaça os pré-requisitos de level de log será manipulada. Contudo, instalando um filtro, você pode colocar critérios adicionais no processamento de logs. Por exemplo, você pode instalar um filtro que permite a emissão de mensagens do tipo <code class=\"docutils literal notranslate\">ERROR</code> de apenas uma fonte em particular.</p>\n<p>Os filters também podem ser usados para modificar o registro de log antes dele ser emitido. Por exemplo, você pode escrever um filter que rebaixa registros de logs do tipo <code class=\"docutils literal notranslate\">ERROR</code> para registros do tipo <code class=\"docutils literal notranslate\">WARNING</code> se um conjunto de critérios em particular for atingido.</p>\n<p>Filters podem ser instalados em loggers ou em handlers; múltiplos filters podem ser usados em sequência para realizar múltiplas ações de filtragem.</p>\n</section>\n<section id=\"formatters\">\n<span id=\"topic-logging-parts-formatters\"></span><h4>Formatadores<a class=\"heading-anchor\" href=\"#formatters\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Finalmente, um registro de log precisa ser renderizado como texto. Formatters ou formatadores em portuguẽs, descrevem o exato formato desse texto. O formatter geralmente consiste de uma string de formatação Python contendo <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logrecord-attributes\" title=\"(em Python v3.14)\"><span class=\"xref std std-ref\">atributos de um LogRecord</span></a>; contudo, você também pode escrever um formatador customizado para implementar comportamentos específicos de formatação.</p>\n</section>\n</section>\n</section>\n<section id=\"using-logging\">\n<h2>Using logging<a class=\"heading-anchor\" href=\"#using-logging\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Depois de você ter configurado os seus loggers, handlers, filters e formatters, você precisa colocar as chamadas de log dentro do seu código. A utilização do framework de log é muito simples. Aqui vai um exemplo:</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>E é só isso! Toda vez que a condição <code class=\"docutils literal notranslate\">bad_mojo</code> for válida, um registro de log indicando um erro será gravado.</p>\n<section id=\"naming-loggers\">\n<h3>Nomeando loggers<a class=\"heading-anchor\" href=\"#naming-loggers\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A chamada <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.getLogger\" title=\"(em Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">logging.getLogger()</code></a> obtém (cria, se necessário) uma instância de um logger. A instância do logger é identificada por um nome. Esse nome é usado para identificar o logger para propósitos de configuração.</p>\n<p>By convention, the logger name is usually <code class=\"docutils literal notranslate\">__name__</code>, the name of\nthe Python module that contains the logger. This allows you to filter\nand handle logging calls on a per-module basis. However, if you have\nsome other way of organizing your logging messages, you can provide\nany dot-separated name to identify your 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>Os caminhos com pontos do nome de um logger definem a hierarquia. O logger <code class=\"docutils literal notranslate\">project.interesting</code> é considerado como o pai do logger <code class=\"docutils literal notranslate\">project.interesting.stuff</code>; o logger <code class=\"docutils literal notranslate\">project</code> é o pai do logger <code class=\"docutils literal notranslate\">project.interesting</code>.</p>\n<p>Por que a hierarquia é importante? Bem, porque os loggers podem ser configurados para <em>propagar</em> as chamadas de log de seus pais. Desta forma, você pode definir um conjunto único de handlers na raiz de uma árvore de loggers, e capturar todas as chamadas de log dentro da subárvore de loggers. Se um handler é definido no namespace <code class=\"docutils literal notranslate\">project</code> ele irá obter todas as mensagens de log emitidas nos loggers <code class=\"docutils literal notranslate\">project.interesting</code> e <code class=\"docutils literal notranslate\">project.interesting.stuff</code>.</p>\n<p>A propagação pode ser controlada para cada logger em especifico. Se você não quiser que um logger em particular propague para os seus pais, você pode desativar esse comportamento.</p>\n</section>\n<section id=\"making-logging-calls\">\n<h3>Fazendo chamadas de log<a class=\"heading-anchor\" href=\"#making-logging-calls\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cada instância de um logger contém um método de entrada para cada um dos leveis padrão de log:</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>Existem ainda outras duas chamadas de log disponíveis:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">logger.log()</code>: Emite manualmente uma mensagem de log com um level de log em específico.</p></li>\n<li><p><code class=\"docutils literal notranslate\">logger.exception()</code>: Cria uma mensagem de log usando o level <code class=\"docutils literal notranslate\">ERROR</code> envolvendo a stack frame, ou estrutura de pilha em português, da exceção atual.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"configuring-logging\">\n<span id=\"id1\"></span><h2>Configuring logging<a class=\"heading-anchor\" href=\"#configuring-logging\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Evidentemente, não é o bastante apenas adicionar chamadas de log no seu código. Você também precisa confgurar os loggers, handlers, filters e formatters para garantir que a saída de log seja exibida de forma útil.</p>\n<p>A biblioteca de log do Python fornece várias técnicas para configurar o log, desde uma interface programática até arquivos de configuração. Por padrão, o Django usa o  <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\" title=\"(em Python v3.14)\"><span class=\"xref std std-ref\">formato dictConfig</span></a>.</p>\n<p>Para configurar os logs, você irá utilizar <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> para definir um dicionário de configurações de log. Essas configurações descrevem os loggers, handlers, filters e formatters que você deseja usar no seu ambiente de log, assim como os leveis de log e outras propriedads que você deseja que esses componentes possuam.</p>\n<p>Por padrão, a configuração <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> é mesclada a <a class=\"reference internal\" href=\"#default-logging-configuration\"><span class=\"std std-ref\">configuração padrão de logs do Django</span></a> usando o esquema a seguir.</p>\n<p>Se a chave <code class=\"docutils literal notranslate\">disable_existing_loggers</code> na configuração dictConfig <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> for definida como sendo <code class=\"docutils literal notranslate\">True</code> (que é o padrão) então todos os loggers da configuração padrão serão desativados. Loggers desativados não são o mesmo que removidos; o logger ainda existirá, mas irá silenciosamente descartar qualquer coisa enviada para ele, sem nem mesmo propagar entradas para um logger pai. Portanto, você deve tomar bastante cuidado ao usar <code class=\"docutils literal notranslate\">'disable_existing_loggers': True</code>; Isso provavelmente não é o que você quer que aconteça. Ao invés disso, você pode configurar <code class=\"docutils literal notranslate\">disable_existing_loggers</code> para <code class=\"docutils literal notranslate\">False</code> e redefinir alguns ou todos os loggers padrão; ou ainda definir a configuração <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> para <code class=\"docutils literal notranslate\">None</code> e <a class=\"reference internal\" href=\"#disabling-logging-configuration\"><span class=\"std std-ref\">cuidar da configuração de logs você mesmo</span></a>.</p>\n<p>O log é configurado como parte da função geral <code class=\"docutils literal notranslate\">setup()</code> do Django. Assim sendo, você pode se certificar que os loggers estarão sempre prontos para serem usados no código do seu projeto.</p>\n<section id=\"examples\">\n<h3>Exemplos<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A documentação completa para <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\" title=\"(em Python v3.14)\"><span class=\"xref std std-ref\">o formato dictConfig</span></a> é a melhor fonte de informação sobre configuração de dicionários de log. Contudo, para te dar uma ideia das possibilidades, aqui vão vários exemplos.</p>\n<p>Primeiro, aqui vai uma configuração simples que grava tudo que vier do logger <a class=\"reference internal\" href=\"#django-logger\"><span class=\"std std-ref\">django</span></a> para um arquivo local:</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>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></div>\n<p>Se você usar esse exemplo, certifique-se de alterar o caminho <code class=\"docutils literal notranslate\">'filename'</code> para um local com permissões de escrita pelo usuário que estiver rodando a aplicação Django.</p>\n<p>Segundo, aqui vai um exemplo de como fazer o sistema de logs fazer prints de logs do Django no console. Isso pode ser útil durante o desenvolvimento local.</p>\n<p>Por padrão, essa configuração só envia mensagens do level <code class=\"docutils literal notranslate\">INFO</code> ou maior para o console (a mesma coisa vale para a configuração padrão de logs do Django, sendo a única exceção que a configuração padrão só exibe registros de logs quando <code class=\"docutils literal notranslate\">DEBUG=True</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=\"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;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=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Finalmente, aqui vai um exemplo de uma configuração bastante complexa de log:</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>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></div>\n<p>Essa configuração de log faz o seguinte:</p>\n<ul>\n<li><p>Identifica a configuração como sendo da ‘versão 1 do formato dictConfig’. Atualmente, essa é a única versão disponível.</p></li>\n<li><p>Define dois formatters:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">simple</code>, que só exibe o nome do level de log (por exemplo <code class=\"docutils literal notranslate\">DEBUG</code>) e a mensagem de log.</p>\n<p>A string <code class=\"docutils literal notranslate\">format</code> é uma string normal de formatação Python descrevendo os detalhes que devem ser exibidos em cada linha de log. A lista completa de detalhes que podem ser exibidos pode ser encontrada em <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#formatter-objects\" title=\"(em Python v3.14)\"><span>Formatter Objects</span></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">verbose</code>, que exibe o nome do level de log, a mensagem de log, e também o tempo, o processo, a thread e o módulo que gerou a mensagem de log.</p></li>\n</ul>\n</li>\n<li><p>Define dois filters:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">project.logging.SpecialFilter</code>, utilizando o alias <code class=\"docutils literal notranslate\">special</code>. Se esse filtro necessitar de argumentos adicionais, eles podem ser fornecidos como chaves adicionais no dicionário de configuração do filter. Nesse caso, o argumento <code class=\"docutils literal notranslate\">foo</code> será dado para o valor de <code class=\"docutils literal notranslate\">bar</code> na instanciação de <code class=\"docutils literal notranslate\">SpecialFilter</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.utils.log.RequireDebugTrue</code>, que transmite registros quando <a class=\"reference internal\" href=\"/pt-br/2.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>Define dois handlers:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">console</code>, a <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#logging.StreamHandler\" title=\"(em Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">StreamHandler</code></a>, which prints any <code class=\"docutils literal notranslate\">INFO</code>\n(or higher) message to <code class=\"docutils literal notranslate\">sys.stderr</code>. This handler uses the <code class=\"docutils literal notranslate\">simple</code>\noutput format.</p></li>\n<li><p><code class=\"docutils literal notranslate\">mail_admins</code>, an <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>, which emails any <code class=\"docutils literal notranslate\">ERROR</code>\n(or higher) message to the site <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\">ADMINS</code></a>. This handler uses the\n<code class=\"docutils literal notranslate\">special</code> filter.</p></li>\n</ul>\n</li>\n<li><p>Configura três loggers:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">django</code>, que transmite todas as mensagens para o handler <code class=\"docutils literal notranslate\">console</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.request</code>, que transmite todas as mensagens do tipo <code class=\"docutils literal notranslate\">ERROR</code> para o handler <code class=\"docutils literal notranslate\">mail_admins</code>. Adicionalmente, esse logger é marcado para <em>não</em> propagar mensagens. Isso significa que as mensagens de log gravadas em <code class=\"docutils literal notranslate\">django.request</code> não serão manipuladas pelo logger <code class=\"docutils literal notranslate\">django</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">myproject.custom</code>, que transmite todas as mensagens do level <code class=\"docutils literal notranslate\">INFO</code> ou maior e que também transmite o filtro <code class=\"docutils literal notranslate\">special</code> para dois handlers – o <code class=\"docutils literal notranslate\">console</code>, e o <code class=\"docutils literal notranslate\">mail_admins</code>. Isso significa que todas as mensagens de level <code class=\"docutils literal notranslate\">INFO</code> (ou maiores) serão exibidas no console; mensagens <code class=\"docutils literal notranslate\">ERROR</code> e <code class=\"docutils literal notranslate\">CRITICAL</code> também serão emitidas via email.</p></li>\n</ul>\n</li>\n</ul>\n</section>\n<section id=\"custom-logging-configuration\">\n<h3>Configurações customizadas de log<a class=\"heading-anchor\" href=\"#custom-logging-configuration\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você não quer usar o formato dictConfig do Python para configurar o seu logger, você pode especificar o seu próprio esquema de configuração.</p>\n<p>A configuração <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> define o callable que será usado para configurar os loggers do Django. Por padrão, ele aponta para a função <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig\" title=\"(em Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">logging.config.dictConfig()</code></a> do Python. Contudo, se você quiser usar um processo diferente de configuração, você pode usar qualquer outro callable que recebe um único argumento. O conteúdo de <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> será fornecido como sendo o valor do argumento onde o log será configurado.</p>\n</section>\n<section id=\"disabling-logging-configuration\">\n<span id=\"id2\"></span><h3>Desabilitando a configuração de log<a class=\"heading-anchor\" href=\"#disabling-logging-configuration\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você não quser configurar qualquer tipo de log (ou se você deseja configurar o log manualmente usando sua própria abordagem), você pode definir <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> para <code class=\"docutils literal notranslate\">None</code>. Isso irá desabilitar o processo de configuração para <a class=\"reference internal\" href=\"#default-logging-configuration\"><span class=\"std std-ref\">configuração de log padrão do Django</span></a>. Segue um exemplo de uma configuração que desabilita a configuração de logs do Django e então configura o log manualemente:</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>Configurar <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING_CONFIG</code></a> como <code class=\"docutils literal notranslate\">None</code> significa tão somente que o processo de configuração automática está desabilitado, não os logs em si. Se você desabilitar o processo de configuração, o Django ainda fará chamadas de logs, recorrendo a qualquer comportamento padrão de log que for definido.</p>\n</section>\n</section>\n<section id=\"django-s-logging-extensions\">\n<h2>Extensões de log do Django<a class=\"heading-anchor\" href=\"#django-s-logging-extensions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O Django fornece uma série de recursos para lidar com requisitos únicos de log em ambientes de Web servers.</p>\n<section id=\"id3\">\n<h3>Loggers<a class=\"heading-anchor\" href=\"#id3\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O Django fornece vários loggers embutidos.</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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The catch-all logger for messages in the  <code class=\"docutils literal notranslate\">django</code> hierarchy. No messages are\nposted using this name but instead using one of the loggers below.</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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Log messages related to the handling of requests. 5XX responses are\nraised as <code class=\"docutils literal notranslate\">ERROR</code> messages; 4XX responses are raised as <code class=\"docutils literal notranslate\">WARNING</code>\nmessages. Requests that are logged to the <code class=\"docutils literal notranslate\">django.security</code> logger aren’t\nlogged to <code class=\"docutils literal notranslate\">django.request</code>.</p>\n<p>Mensagens para esse logger possuem o seguinte contexto adicional:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">status_code</code>: o código da resposta HTTP associado a requisição.</p></li>\n<li><p><code class=\"docutils literal notranslate\">request</code>: O objeto da requisição que gerou a mensagem de log.</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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Mensagens de log relacionadas com a manipulação de requisições recebidas pelo comando  <a class=\"reference internal\" href=\"/pt-br/2.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a>. Respostas HTTP 5XX são logadas como mensagens do tipo <code class=\"docutils literal notranslate\">ERROR</code>, respostas HTTP 4XX são logadas como mensagens do tipo <code class=\"docutils literal notranslate\">WARNING</code>, e todo o resto é logado como <code class=\"docutils literal notranslate\">INFO</code>.</p>\n<p>Mensagens para esse logger possuem o seguinte contexto adicional:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">status_code</code>: o código da resposta HTTP associado a requisição.</p></li>\n<li><p><code class=\"docutils literal notranslate\">request</code>: O objeto da requisição que gerou a mensagem de log.</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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Mensagens de log relacionadas a renderização de templates.</p>\n<ul class=\"simple\">\n<li><p>Variáveis de contexto esquecidas são logadas como mensagens do tipo <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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Mensagens relacionadas a interação de código com o banco de dados. Por exemplo, cada comando SQL executado por uma requisição é logada no level <code class=\"docutils literal notranslate\">DEBUG</code> para esse logger.</p>\n<p>Mensagens para esse logger possuem o seguinte contexto adicional:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">duration</code>: O tempo tomado para executar o comando SQL.</p></li>\n<li><p><code class=\"docutils literal notranslate\">sql</code>: O comando SQL que foi executado.</p></li>\n<li><p><code class=\"docutils literal notranslate\">params</code>: Os parâmetros que foram usados na chamada SQL.</p></li>\n</ul>\n<p>Por questões de performance, o log de SQL só é ativado quando <code class=\"docutils literal notranslate\">settings.DEBUG</code> é configurado como <code class=\"docutils literal notranslate\">True</code>, independentemente do level de log ou dos handlers que estão instalados.</p>\n<p>Nesse logger não estão incluídos initializações a level de framework (ex <code class=\"docutils literal notranslate\">SET TIMEZONE</code>) ou consultas relacionadas ao gerenciamento de transações (ex <code class=\"docutils literal notranslate\">BEGIN</code>, <code class=\"docutils literal notranslate\">COMMIT</code>, e <code class=\"docutils literal notranslate\">ROLLBACK</code>). Ative o log de consultas no seu banco de dados se você desejar ver todas as consultas de banco.</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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Os loggers de segurança irão receber mensagens em qualquer ocorrência de <a class=\"reference internal\" href=\"/pt-br/2.1/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\">SuspiciousOperation</code></a> e outros erros relacionados a segurança. Existe um sub-logger para cada subtipo de erro de segurança, incluindo todos do tipo <code class=\"docutils literal notranslate\">SuspiciousOperation</code>s. O level de log depende de onde a exceção for manipulada. A maioria das ocorrências serão logadas como um aviso. enquanto que qualquer <code class=\"docutils literal notranslate\">SuspiciousOperation</code>s que alcançar o handler WSGI será logada como um erro. Por exemplo, quando um cabeçalho HTTP <code class=\"docutils literal notranslate\">Host</code> é incluído em uma requisição de um cliente que não for encontrado em <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\">ALLOWED_HOSTS</code></a>, Django irá retornar uma resposta 400, e uma mensagem de erro será logada para o logger <code class=\"docutils literal notranslate\">django.security.DisallowedHost</code>.</p>\n<p>Esses eventos de log irão alcançar o logger <code class=\"docutils literal notranslate\">django</code> por padrão, que irá enviar emails de eventos de erro para os administradores quando <code class=\"docutils literal notranslate\">DEBUG=False</code>. Requisições resultando em uma resposta 400 devido a uma <code class=\"docutils literal notranslate\">SuspiciousOperation</code> não serão logadas no logger <code class=\"docutils literal notranslate\">django.request</code>, mas somente para o logger <code class=\"docutils literal notranslate\">django.security</code>.</p>\n<p>Para silenciar um tipo em específico de <code class=\"docutils literal notranslate\">SuspiciousOperation</code>, você pode sobrescrever o logger em específico seguindo o exemplo a seguir:</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=\"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>Outros loggers <code class=\"docutils literal notranslate\">django.security</code> não baseados em <code class=\"docutils literal notranslate\">SuspiciousOperation</code> são:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">django.security.csrf</code>: Para <a class=\"reference internal\" href=\"/pt-br/2.1/ref/csrf/#csrf-rejected-requests\"><span class=\"std std-ref\">falhas 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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Loga as consultas SQL que são executadas durante mudanças de esquema no banco de dados pelo <a class=\"reference internal\" href=\"/pt-br/2.1/topics/migrations/\"><span class=\"doc\">migrations framework</span></a>. Note que ele não irá logar as consultas executadas pela classe <a class=\"reference internal\" href=\"/pt-br/2.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>. As mensagens para esse logger possuem <code class=\"docutils literal notranslate\">params</code> e <code class=\"docutils literal notranslate\">sql</code> em seu contexto extra (mas ao contrário de <code class=\"docutils literal notranslate\">django.db.backends</code>, não possui <code class=\"docutils literal notranslate\">duration</code>). Os valores tem o mesmo significado como explicado em <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>Manipuladores<a class=\"heading-anchor\" href=\"#id4\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O Django fornece um handler de log adicional para os já fornecidos pelo módulo de log do Python.</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><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.AdminEmailHandler\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This handler sends an email to the site <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\">ADMINS</code></a> for each log\nmessage it receives.</p>\n<p>Se o registro de log contém um atributo <code class=\"docutils literal notranslate\">request</code>, todos os detalhes da requisição serão incluídos no email. O assunto do email irá incluir a fase “internal IP” se o endereço IP do cliente foi informado em <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-INTERNAL_IPS\"><code class=\"xref std std-setting docutils literal notranslate\">INTERNAL_IPS</code></a>; Caso contrário, ele irá incluir o  “EXTERNAL IP”.</p>\n<p>Se o registro de log contiver infromações de rastreamento de pilha, o rastreamento de pilha será incluído no email.</p>\n<p>O argumento <code class=\"docutils literal notranslate\">include_html</code> de <code class=\"docutils literal notranslate\">AdminEmailHandler</code> é usado para controlar se o email de traceback inclui um anexo HTML contendo todo o conteúdo da página Web de debug que seria reproduzida se <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> fosse <code class=\"docutils literal notranslate\">True</code>. Para ativar esse valor em sua configuração, inclua ela na definição do handler para <code class=\"docutils literal notranslate\">django.utils.log.AdminEmailHandler</code>, confome segue:</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=\"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>Note que a versão HTML do email contém um traceback completo, com nomes e valores de variáveis locais em cada level da pilha, além dos valores da sua configuração do Django. Essa informação é potencialmente muito sensível, e você pode não querer enviá-la por email. Considere usar algo como <a class=\"reference external\" href=\"https://pypi.org/project/sentry/\">Sentry</a> para obter o melhor dos dois mundos – a rica informação dos tracebacks completos e mais a segurança de <em>não</em> enviar informações por email. Você pode também explicitamente designar certas informações sensíveis para serem filtradas para fora dos relatórios de erro – saiba mais em <a class=\"reference internal\" href=\"/pt-br/2.1/howto/error-reporting/#filtering-error-reports\"><span class=\"std std-ref\">Filtrando relatórios de erro</span></a>.</p>\n<p>Utilizando o argumento <code class=\"docutils literal notranslate\">email_backend</code> de <code class=\"docutils literal notranslate\">AdminEmailHandler</code>, o <a class=\"reference internal\" href=\"/pt-br/2.1/topics/email/#topic-email-backends\"><span class=\"std std-ref\">email backend</span></a> que está sendo usado pelo handler pode ser sobrescrito, conforme segue:</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=\"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>Por padrão, uma instância do backend de email especificado em <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_BACKEND</code></a> será usado.</p>\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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Envia emails para os usuários administradores. Para customizar esse comportamento, você pode fazer uma subclasse de <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> e sobrescrever esse método.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"id5\">\n<h3>Filtros<a class=\"heading-anchor\" href=\"#id5\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django provides some log filters in addition to those provided by the Python\nlogging module.</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Esse filter aceita uma função de callback (que deve aceitar um único argumento, o registro a ser logado), e chama essa função para cada registro que passa pelo filter. A manipulação desse registro não será continuada caso a função de callback retorne False.</p>\n<p>Por exemplo, para filtrar para fora exceções do tipo <a class=\"reference internal\" href=\"/pt-br/2.1/ref/exceptions/#django.http.UnreadablePostError\" title=\"django.http.UnreadablePostError\"><code class=\"xref py py-exc docutils literal notranslate\">UnreadablePostError</code></a> (levantadas quando o usuário cancela um upload) de emails destinadoas a administradores, você teria que criar uma função de filtro:</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>E então adicioná-la na sua configuração de log:</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=\"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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Esse filtro irá passar adiante registros de logs somente quando settings.DEBUG for False.</p>\n<p>Esse filtro é usado conforme a seguir na configuração default <a class=\"reference internal\" href=\"/pt-br/2.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\">LOGGING</code></a> para garantir que a classe <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> somente envie emails de erro para os administradores quando <a class=\"reference internal\" href=\"/pt-br/2.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=\"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=\"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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Esse filtro é similar a <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>, exceto pelo fato de que os registros são passados adiante somente quando <a class=\"reference internal\" href=\"/pt-br/2.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>A configuração default de log do Django<a class=\"heading-anchor\" href=\"#django-s-default-logging-configuration\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Por padrão, o Django configura o log da seguinte forma:</p>\n<p>Quando <a class=\"reference internal\" href=\"/pt-br/2.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>The <code class=\"docutils literal notranslate\">django</code> logger sends messages in the <code class=\"docutils literal notranslate\">django</code> hierarchy (except\n<code class=\"docutils literal notranslate\">django.server</code>) at the <code class=\"docutils literal notranslate\">INFO</code> level or higher to the console.</p></li>\n</ul>\n<p>Quando <a class=\"reference internal\" href=\"/pt-br/2.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>The <code class=\"docutils literal notranslate\">django</code> logger sends messages in the <code class=\"docutils literal notranslate\">django</code> hierarchy (except\n<code class=\"docutils literal notranslate\">django.server</code>)  with <code class=\"docutils literal notranslate\">ERROR</code> or <code class=\"docutils literal notranslate\">CRITICAL</code> level to\n<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>Independentemente do valor de <a class=\"reference internal\" href=\"/pt-br/2.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>The <a class=\"reference internal\" href=\"#django-server-logger\"><span class=\"std std-ref\">django.server</span></a> logger sends messages at the <code class=\"docutils literal notranslate\">INFO</code> level\nor higher to the console.</p></li>\n</ul>\n<p>All loggers except <a class=\"reference internal\" href=\"#django-server-logger\"><span class=\"std std-ref\">django.server</span></a> propagate logging to their\nparents, up to the root <code class=\"docutils literal notranslate\">django</code> logger. The <code class=\"docutils literal notranslate\">console</code> and <code class=\"docutils literal notranslate\">mail_admins</code>\nhandlers are attached to the root logger to provide the behavior described\nabove.</p>\n<p>Veja também <a class=\"reference internal\" href=\"#configuring-logging\"><span class=\"std std-ref\">Configurando o log</span></a> para aprender como você pode complementar ou trocar essa configuração padrão de log.</p>\n</section>","rootId":"module-django.utils.log","toc":[{"title":"Uma breve introdução ao log de dados","anchor":"a-quick-logging-primer","children":[{"title":"O elenco de jogadores","anchor":"the-cast-of-players","children":[{"title":"Loggers","anchor":"loggers","children":[]},{"title":"Manipuladores","anchor":"handlers","children":[]},{"title":"Filtros","anchor":"filters","children":[]},{"title":"Formatadores","anchor":"formatters","children":[]}]}]},{"title":"Using logging","anchor":"using-logging","children":[{"title":"Nomeando loggers","anchor":"naming-loggers","children":[]},{"title":"Fazendo chamadas de log","anchor":"making-logging-calls","children":[]}]},{"title":"Configuring logging","anchor":"configuring-logging","children":[{"title":"Exemplos","anchor":"examples","children":[]},{"title":"Configurações customizadas de log","anchor":"custom-logging-configuration","children":[]},{"title":"Desabilitando a configuração de log","anchor":"disabling-logging-configuration","children":[]}]},{"title":"Extensões de log do 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":"Manipuladores","anchor":"id4","children":[]},{"title":"Filtros","anchor":"id5","children":[]}]},{"title":"A configuração default de log do Django","anchor":"django-s-default-logging-configuration","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Usando o Django","url":"/pt-br/2.1/topics/"}],"prev":{"docname":"topics/i18n/timezones","title":"Time zones","url":"/pt-br/2.1/topics/i18n/timezones/"},"next":{"docname":"topics/pagination","title":"Pagination","url":"/pt-br/2.1/topics/pagination/"},"formats":{"html":"/pt-br/2.1/topics/logging/","markdown":"/pt-br/2.1/topics/logging.md","json":"/pt-br/2.1/topics/logging.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/logging.txt","official":"https://docs.djangoproject.com/pt-br/2.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","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}