{"title":"Journalisation","version":"1.9","locale":"fr","docname":"topics/logging","url":"/fr/1.9/topics/logging/","canonical":"https://djangodocs.dev/fr/1.9/topics/logging/","summary":"Une introduction rapide sur la journalisation Lien vers cette rubrique # Django utilise le module logging intégré de Python pour effectuer la journalisation…","html":"<span id=\"logging\"></span><h1>Journalisation<a class=\"heading-anchor\" href=\"#module-django.utils.log\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"a-quick-logging-primer\">\n<h2>Une introduction rapide sur la journalisation<a class=\"heading-anchor\" href=\"#a-quick-logging-primer\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django utilise le module <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#module-logging\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">logging</span></code></a> intégré de Python pour effectuer la journalisation système. L’utilisation de ce module est abordé en détails dans la propre documentation de Python. Cependant, si vous n’avez jamais utilisé le système de journalisation de Python (ou même si c’est le cas), voici un aperçu rapide.</p>\n<section id=\"the-cast-of-players\">\n<h3>Les acteurs en jeu<a class=\"heading-anchor\" href=\"#the-cast-of-players\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Une configuration de journalisation Python consiste en quatre parties :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-loggers\"><span class=\"std std-ref\">Journaliseurs</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-handlers\"><span class=\"std std-ref\">Gestionnaires</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-filters\"><span class=\"std std-ref\">Filtres</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#topic-logging-parts-formatters\"><span class=\"std std-ref\">Formateurs</span></a></p></li>\n</ul>\n<section id=\"loggers\">\n<span id=\"topic-logging-parts-loggers\"></span><h4>Journaliseurs<a class=\"heading-anchor\" href=\"#loggers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Un journaliseur (« logger ») est le point d’entrée dans le système de journalisation. Chaque journaliseur est un réceptacle nommé dans lequel les messages sont écrits en vue de leur traitement.</p>\n<p>Un journaliseur est configuré avec un <em>niveau de journalisation</em> (« log level »). Ce niveau définit la sévérité des messages que le journaliseur va traiter. Python définit les niveaux de journalisation suivants :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>: information système de bas niveau à des fins de débogage</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>: information système générale</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code>: information décrivant la présence d’un problème mineur.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>: information décrivant la présence d’un problème majeur.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code>: information décrivant la présence d’un problème critique.</p></li>\n</ul>\n<p>Chaque message écrit dans le journaliseur est un <em>enregistrement de journal</em> (« log record »). Chacun de ces enregistrements possède également un <em>niveau de journalisation</em> indiquant la sévérité de ce message spécifique. Un enregistrement de journal peut aussi contenir des métadonnées utiles décrivant l’événement à journaliser. Cela peut inclure des détails tels qu’une trace de débogage ou un code d’erreur.</p>\n<p>Lorsqu’un message est transmis au journaliseur, le niveau de journalisation du message est comparé à celui du journaliseur. Si le niveau de journalisation du message correspond ou dépasse celui du journaliseur, le message continue d’être traité. Dans le cas contraire, le message est ignoré.</p>\n<p>Dès qu’un journaliseur a déterminé qu’un message doit être traité, il est transmis à un <em>gestionnaire</em> (« handler »).</p>\n</section>\n<section id=\"handlers\">\n<span id=\"topic-logging-parts-handlers\"></span><h4>Gestionnaires<a class=\"heading-anchor\" href=\"#handlers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Le gestionnaire est le moteur déterminant ce qui doit arriver à chaque message d’un journaliseur. Il décrit un comportement particulier de journalisation, tel que l’écriture d’un message à l’écran, dans un fichier ou dans un connecteur réseau.</p>\n<p>Comme les journaliseurs, les gestionnaires possèdent aussi un niveau de journalisation. Si le niveau de journalisation d’un enregistrement de journal n’est pas au moins équivalent à celui du gestionnaire, ce dernier ignore le message.</p>\n<p>Un journaliseur peut avoir plusieurs gestionnaires et le niveau de journalisation de chaque gestionnaire peut être différent. De cette façon, il est possible de fournir différentes formes de notifications selon l’importance d’un message. Par exemple, vous pouvez installer un gestionnaire qui redirige les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code> vers un service de radiomessagerie, alors qu’un autre gestionnaire enverra tous les messages (y compris ceux de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code>) dans un fichier pour analyse ultérieure.</p>\n</section>\n<section id=\"filters\">\n<span id=\"topic-logging-parts-filters\"></span><h4>Filtres<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Un filtre permet d’ajouter un contrôle supplémentaire sur la sélection des enregistrements de journal lorsqu’ils sont transmis du journaliseur au gestionnaire.</p>\n<p>Par défaut, tout message de journal dont le niveau de journalisation est suffisant sera traité. Cependant, en installant un filtre, vous pouvez définir des critères supplémentaires dans le processus de journalisation. Par exemple, vous pourriez installer un filtre limitant l’émission de messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> à une source particulière.</p>\n<p>Les filtres peuvent ont aussi la possibilité de modifier l’enregistrement de journal avant son émission. Par exemple, vous pourriez écrire un filtre qui abaisse le niveau de journalisation du message de <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> si certains critères sont respectés.</p>\n<p>Les filtres peuvent être installés pour les journaliseurs ou pour les gestionnaires ; il est aussi possible d’enchaîner plusieurs filtres pour effectuer différentes actions de filtrage.</p>\n</section>\n<section id=\"formatters\">\n<span id=\"topic-logging-parts-formatters\"></span><h4>Formateurs<a class=\"heading-anchor\" href=\"#formatters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour terminer, un enregistrement de journal doit être produit sous forme de texte. Les formateurs spécifient le format exact de ce texte. En général, un formateur correspond à une chaîne de format Python contenant des <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logrecord-attributes\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">attributs LogRecord</span></a> ; cependant, vous pouvez très bien écrire vos propres formateurs afin d’implémenter un comportement de format spécifique.</p>\n</section>\n</section>\n</section>\n<section id=\"using-logging\">\n<h2>La journalisation en pratique<a class=\"heading-anchor\" href=\"#using-logging\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Après avoir configuré les journaliseurs, les gestionnaires, les filtres et les formateurs, il reste à placer les appels de journalisation dans votre code. L’utilisation du système de journalisation est très simple. Voici un exemple :</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=\"w\"> </span><span class=\"nn\">logging</span>\n\n<span class=\"c1\"># Get an instance of a logger</span>\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\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">arg1</span><span class=\"p\">,</span> <span class=\"n\">arg</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">if</span> <span class=\"n\">bad_mojo</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Log an error message</span>\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"s1\">&#39;Something went wrong!&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ça y est ! Lors de chaque entrée dans la condition <code class=\"docutils literal notranslate\"><span class=\"pre\">bad_mojo</span></code>, une ligne d’erreur sera insérée dans le journal.</p>\n<section id=\"naming-loggers\">\n<h3>Nommage des journaliseurs<a class=\"heading-anchor\" href=\"#naming-loggers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’appel à <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.getLogger\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">logging.getLogger()</span></code></a> obtient (et crée si nécessaire) une instance de journaliseur. Cette instance est identifiée par un nom. Ce nom sert à identifier le journaliseur pour la configuration.</p>\n<p>Par convention, le nom du journaliseur est habituellement <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code>, le nom du module Python contenant le journaliseur. Cela permet de filtrer et de traiter les appels de journalisation selon les modules. Cependant, si vous organisez vos messages de journalisation d’une autre manière, vous pouvez indiquer n’importe quel nom sous forme de notation pointée pour identifier un journaliseur :</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>\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=\"s1\">&#39;project.interesting.stuff&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La notation pointée des noms de journaliseurs définit une hiérarchie. Le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">project.interesting</span></code> est considéré comme le parent du journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">project.interesting.stuff</span></code>.  Le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">project</span></code> est le parent du journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">project.interesting</span></code>.</p>\n<p>Pourquoi cette hiérarchie est-elle importante ? Et bien, parce que les journaliseurs peuvent être configurés pour <em>propager</em> les appels de journalisation qu’ils reçoivent vers leurs parents. De cette manière, vous pouvez définir un seul ensemble de gestionnaires à la racine de l’arborescence d’un journaliseur et capturer tous les appels de journalisation dans la sous-arborescence des journaliseurs. Un gestionnaire de journalisation défini dans l’espace de noms <code class=\"docutils literal notranslate\"><span class=\"pre\">project</span></code> intercepte tous les messages de journalisation émis au niveau des journaliseurs <code class=\"docutils literal notranslate\"><span class=\"pre\">project.interesting</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">project.interesting.stuff</span></code>.</p>\n<p>Cette propagation peut être contrôlée pour chaque journaliseur individuellement. Si vous souhaitez qu’un journaliseur particulier ne propage pas les messages à ses parents, vous pouvez désactiver ce comportement.</p>\n</section>\n<section id=\"making-logging-calls\">\n<h3>Appels de journalisation<a class=\"heading-anchor\" href=\"#making-logging-calls\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Toute instance de journaliseur contient une méthode d’appel correspondant à chaque niveau de journalisation par défaut :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.debug()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.info()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.warning()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.error()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.critical()</span></code></p></li>\n</ul>\n<p>Deux autres appels de journalisation sont disponibles :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.log()</span></code>: émet manuellement un message de journalisation au niveau indiqué.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger.exception()</span></code>: crée un message de journalisation de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> enveloppant la pile d’exception actuelle.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"configuring-logging\">\n<span id=\"id1\"></span><h2>Configuration de la journalisation<a class=\"heading-anchor\" href=\"#configuring-logging\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le placement d’appels de journalisation dans le code n’est naturellement pas suffisant. Il faut aussi configurer les journaliseurs, les gestionnaires, les filtres et les formateurs pour s’assurer que le résultat de la journalisation s’affiche de manière exploitable.</p>\n<p>Python’s logging library provides several techniques to configure\nlogging, ranging from a programmatic interface to configuration files.\nBy default, Django uses the <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">dictConfig format</span></a>.</p>\n<p>Pour configurer la journalisation, il s’agit de définir un dictionnaire de réglages de journalisation dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a>. Ces réglages décrivent les journaliseurs, les gestionnaires, les filtres et les formateurs que vous souhaitez mettre en place, ainsi que les niveaux de journalisation et d’autres propriétés que vous voulez attribuer à ces composants.</p>\n<p>Par défaut, le réglage <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> est fusionné avec <a class=\"reference internal\" href=\"#default-logging-configuration\"><span class=\"std std-ref\">la configuration de journalisation par défaut de Django</span></a> en se basant sur les principes suivants.</p>\n<p>Si la clé <code class=\"docutils literal notranslate\"><span class=\"pre\">disable_existing_loggers</span></code> du dictionnaire <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> contient <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (valeur par défaut), tous les journaliseurs de la configuration par défaut seront désactivés. Désactiver un journaliseur n’est pas équivalent à sa suppression ; le journaliseur existe toujours, mais il élimine silencieusement les messages qu’il reçoit, sans même les propager au journaliseur parent. Vous devez donc vous méfier du réglage <code class=\"docutils literal notranslate\"><span class=\"pre\">'disable_existing_loggers':</span> <span class=\"pre\">True</span></code>; cela ne fait souvent pas ce qu’on aimerait. Par contre, vous pouvez définir <code class=\"docutils literal notranslate\"><span class=\"pre\">disable_existing_loggers</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> et redéfinir certains ou tous les journaliseurs par défaut. Une autre stratégie est de définir <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING_CONFIG</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> et vous <a class=\"reference internal\" href=\"#disabling-logging-configuration\"><span class=\"std std-ref\">charger vous-même de la configuration de la journalisation</span></a>.</p>\n<p>La journalisation est configurée dans le cadre de la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> générale de Django. Ainsi, vous pouvez être certain que les journaliseurs sont toujours prêts à être utilisés par le code de votre projet.</p>\n<section id=\"examples\">\n<h3>Exemples<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The full documentation for <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">dictConfig format</span></a>\nis the best source of information about logging configuration dictionaries.\nHowever, to give you a taste of what is possible, here are several examples.</p>\n<p>Premièrement, voici une configuration simple qui écrit toutes les journalisations provenant du journaliseur <a class=\"reference internal\" href=\"#django-logger\"><span class=\"std std-ref\">django</span></a> dans un fichier 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><span class=\"n\">LOGGING</span> <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>Si vous utilisez cet exemple, prenez soin de remplacer le chemin <code class=\"docutils literal notranslate\"><span class=\"pre\">'filename'</span></code> par un emplacement accessible en écriture par l’utilisateur faisant fonctionner l’application Django.</p>\n<p>Deuxièmement, voici un exemple expliquant comment journaliser les messages de Django dans la console. Cela peut se révéler utile en phase de développement local.</p>\n<p>Par défaut, cette configuration n’envoie que les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou plus élevé vers la console (comme la configuration de journalisation par défaut de Django, sauf que cette dernière n’affiche les messages de journalisation que si <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG=True</span></code>). Django ne génère pas tant de messages de ce genre. Cependant, avec cetet configuration, vous pouvez aussi définir la variable d’environnement <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_LOG_LEVEL=DEBUG</span></code> pour voir tous les messages de débogage  journalisés par Django, ce qui est très bavard car toutes les requêtes de base de données sont incluses :</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\">os</span>\n\n<span class=\"n\">LOGGING</span> <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> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getenv</span><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<aside class=\"version-note version-changed\" data-version=\"1.9\">\n<p class=\"version-note-title\">Changed in Django 1.9</p><p>La configuration de journalisation par défaut de Django a changé. Consultez les <a class=\"reference internal\" href=\"/fr/1.9/releases/1.9/#default-logging-changes-19\"><span class=\"std std-ref\">notes de publication</span></a> pour obtenir une description des modifications.</p>\n</aside>\n<p>Finalement, voici un exemple d’une configuration de journalisation plutôt complexe :</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=\"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)s</span><span class=\"s1\"> </span><span class=\"si\">%(asctime)s</span><span class=\"s1\"> </span><span class=\"si\">%(module)s</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)s</span><span class=\"s1\">&#39;</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)s</span><span class=\"s1\"> </span><span class=\"si\">%(message)s</span><span class=\"s1\">&#39;</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>Cette configuration de journalisation effectue les choses suivantes :</p>\n<ul>\n<li><p>Elle identifie la configuration comme étant au format « dictConfig version 1 ». C’est actuellement la seule version du format dictConfig.</p></li>\n<li><p>Elle définit deux formateurs :</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">simple</span></code> qui ne fait qu’afficher le nom du niveau de journal (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>) et le message de journal.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">format</span></code> string is a normal Python formatting string\ndescribing the details that are to be output on each logging\nline. The full list of detail that can be output can be\nfound in <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#formatter-objects\" title=\"(disponible dans Python v3.14)\"><span>Formatter Objects</span></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbose</span></code> qui affiche le nom du niveau de journal, le message de journal ainsi que l’heure, le processus, le fil d’exécution et le module qui ont généré le message.</p></li>\n</ul>\n</li>\n<li><p>Elle définit deux filtres :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">project.logging.SpecialFilter</span></code> par l’alias <code class=\"docutils literal notranslate\"><span class=\"pre\">special</span></code>. Si ce filtre nécessite des paramètres supplémentaires, ils peuvent être fournis sous forme de clés supplémentaires dans le dictionnaire de configuration du filtre. Dans ce cas, le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> reçoit la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">bar</span></code> au moment de l’instanciation de <code class=\"docutils literal notranslate\"><span class=\"pre\">SpecialFilter</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.log.RequireDebugTrue</span></code>, qui transmet plus loin les messages lorsque <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n</ul>\n</li>\n<li><p>Elle définit deux gestionnaires :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">console</span></code>, un gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">StreamHandler</span></code> affichant tout message de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> ou plus élevé vers la sortie d’erreur (stderr). Ce gestionnaire utilise le format d’affichage <code class=\"docutils literal notranslate\"><span class=\"pre\">simple</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins</span></code>, un gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code> qui avertit par courriel les administrateurs du site de tout message de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> ou plus élevé. Ce gestionnaire utilise le filtre d’affichage <code class=\"docutils literal notranslate\"><span class=\"pre\">special</span></code>.</p></li>\n</ul>\n</li>\n<li><p>Elle configure trois journaliseurs :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code>, qui transmet tous les messages au gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">console</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code> qui transmet tous les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> au gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins</span></code>. De plus, ce journaliseur est configuré pour ne <em>pas</em> propager les messages. Cela signifie que les messages à destination de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code> ne seront pas traités par le journaliseur parent <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myproject.custom</span></code> qui transmet tous les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou plus élevé et correspondant au filtre <code class=\"docutils literal notranslate\"><span class=\"pre\">special</span></code> vers deux gestionnaires, <code class=\"docutils literal notranslate\"><span class=\"pre\">console</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins</span></code>. Cela signifie que tous les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou plus élevé seront affichés dans la console. Les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code> seront de plus expédiés par courriel.</p></li>\n</ul>\n</li>\n</ul>\n</section>\n<section id=\"custom-logging-configuration\">\n<h3>Configuration personnalisée de la journalisation<a class=\"heading-anchor\" href=\"#custom-logging-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous ne souhaitez pas utiliser le format <code class=\"docutils literal notranslate\"><span class=\"pre\">dictConfig</span></code> de Python pour configurer la journalisation, il est possible d’indiquer un système de configuration alternatif.</p>\n<p>Le réglage <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING_CONFIG</span></code></a> définit l’exécutable utilisé pour configurer les journaliseurs de Django. Par défaut, il indique la fonction  <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">logging.config.dictConfig()</span></code></a> de Python. Cependant, si vous souhaitez utiliser un autre procédé de configuration, vous pouvez indiquer n’importe quel autre exécutable acceptant un seul paramètre. Le contenu de <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> sera fourni comme valeur de ce paramètre au moment de la configuration de la journalisation.</p>\n</section>\n<section id=\"disabling-logging-configuration\">\n<span id=\"id2\"></span><h3>Désactivation de la configuration de journalisation<a class=\"heading-anchor\" href=\"#disabling-logging-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous ne souhaitez pas configurer de journalisation (ou que vous vouliez le faire manuellement selon votre propre méthode), vous pouvez définir <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING_CONFIG</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Cela va désactiver le processus de configuration pour la ref:journalisation par défaut de Django &lt;default-logging-configuration&gt;. Voici un exemple qui désactive la configuration de journalisation de Django, puis qui configure manuellement la journalisation :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>settings.py</code></figcaption><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=\"settings.py\"><code><span class=\"n\">LOGGING_CONFIG</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">logging.config</span>\n<span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">config</span><span class=\"o\">.</span><span class=\"n\">dictConfig</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>En définissant <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING_CONFIG</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, vous ne faites que désactiver le processus de configuration automatique, pas la journalisation elle-même. Même quand vous désactivez le processus de configuration, Django continue de faire appel à la journalisation, dont le comportement correspondra alors à ce qui est défini par défaut.</p>\n</section>\n</section>\n<section id=\"django-s-logging-extensions\">\n<h2>Extensions de journalisation de Django<a class=\"heading-anchor\" href=\"#django-s-logging-extensions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django fournit un certain nombre d’utilitaires pour gérer les exigences particulières de la journalisation dans le contexte d’un environnement de serveur Web.</p>\n<section id=\"id3\">\n<h3>Journaliseurs<a class=\"heading-anchor\" href=\"#id3\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django fournit plusieurs journaliseurs intégrés :</p>\n<section id=\"django\">\n<span id=\"django-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code><a class=\"heading-anchor\" href=\"#django\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> est le journaliseur « fourre-tout ». Aucun message n’est directement envoyé à ce journaliseur.</p>\n</section>\n<section id=\"django-request\">\n<span id=\"django-request-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code><a class=\"heading-anchor\" href=\"#django-request\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Messages de journal liés au traitement des requêtes. Les réponses 5xx sont signalées comme des messages <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>. Les réponses 4xx sont signalées comme des messages <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code>.</p>\n<p>Les messages envoyés à ce journaliseur possèdent le contexte supplémentaire suivant :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">status_code</span></code>: le code de réponse HTTP associé à la requête.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>: l’objet requête qui a généré le message de journal.</p></li>\n</ul>\n</section>\n<section id=\"django-template\">\n<span id=\"django-template-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.template</span></code><a class=\"heading-anchor\" href=\"#django-template\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"1.9\">\n<p class=\"version-note-title\">New in Django 1.9</p></aside>\n<p>Journalise les messages liés au rendu des gabarits.</p>\n<ul class=\"simple\">\n<li><p>Les variables de contexte manquantes sont journalisées comme des messages de type <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>.</p></li>\n<li><p>Les exceptions non interceptées générées pendant le rendu d’une balise  <a class=\"reference internal\" href=\"/fr/1.9/ref/templates/builtins/#std-templatetag-include\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">include</span> <span class=\"pre\">%}</span></code></a> sont journalisées comme messages <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> lorsque le mode débogage est désactivé (utile car <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">include</span> <span class=\"pre\">%}</span></code> réduit au silence l’exception et renvoie une chaîne vide dans ce cas).</p></li>\n</ul>\n</section>\n<section id=\"django-db-backends\">\n<span id=\"django-db-logger\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends</span></code><a class=\"heading-anchor\" href=\"#django-db-backends\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Messages en lien avec l’interaction entre le code et la base de données. Par exemple, chaque instruction SQL de niveau applicatif exécutée par une requête est envoyée à ce journaliseur au niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>.</p>\n<p>Les messages envoyés à ce journaliseur possèdent le contexte supplémentaire suivant :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">duration</span></code>: le temps d’exécution de l’instruction SQL concernée.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code>: l’instruction SQL exécutée.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>: les paramètres utilisés dans l’appel SQL.</p></li>\n</ul>\n<p>Pour des raisons de performance, la journalisation SQL n’est activée que lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.DEBUG</span></code> est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, peu importe le niveau de journalisation ou les gestionnaires installés.</p>\n<p>Cette journalisation ne concerne pas l’initialisation au niveau infrastructure (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">SET</span> <span class=\"pre\">TIMEZONE</span></code>) ni les requêtes de gestion de transaction (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">BEGIN</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">COMMIT</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">ROLLBACK</span></code>). Activez la journalisation des requêtes au niveau de la base de données si vous souhaitez voir toutes les requêtes à la base de données.</p>\n</section>\n<section id=\"django-security\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.security.*</span></code><a class=\"heading-anchor\" href=\"#django-security\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les journaliseurs <code class=\"docutils literal notranslate\"><span class=\"pre\">security</span></code> reçoivent les messages à chaque occurrence de <a class=\"reference internal\" href=\"/fr/1.9/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code></a>. Il existe un sous-sérialiseur pour chaque sous-type de <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code>. Le niveau des événements journalisés dépend de l’endroit où l’exception est traitée. La plupart des occurrences sont journalisées comme des avertissements, alors que toute exception <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code> atteignant le gestionnaire WSGI sera journalisée comme une erreur. Par exemple, lorsqu’un en-tête HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">Host</span></code> contenu dans une requête de client ne correspond pas à  <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a>, Django renvoie une réponse 400 et un message d’erreur est journalisé dans le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">django.security.DisallowedHost</span></code>.</p>\n<p>Ces événements de journal aboutissent par défaut dans le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code>, qui envoie les erreurs par courriel aux administrateurs lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG=False</span></code>. Les requêtes aboutissant à une réponse 400 en raison d’une erreur <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code> ne sont pas journalisées dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code>, mais seulement dans le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">django.security</span></code>.</p>\n<p>Pour réduire au silence un type particulier de <code class=\"docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code>, vous pouvez surcharger le journaliseur correspondant en suivant cet exemple :</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</section>\n<section id=\"django-db-backends-schema\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.schema</span></code><a class=\"heading-anchor\" href=\"#django-db-backends-schema\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Journalise les requêtes SQL exécutées pendant les modifications de schéma de la base de données effectuées par le <a class=\"reference internal\" href=\"/fr/1.9/topics/migrations/\"><span class=\"doc\">système des migrations</span></a>. Notez que les requêtes exécutées par <a class=\"reference internal\" href=\"/fr/1.9/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunPython</span></code></a> ne sont pas journalisées.</p>\n</section>\n</section>\n<section id=\"id4\">\n<h3>Gestionnaires<a class=\"heading-anchor\" href=\"#id4\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django propose un gestionnaire de journalisation en plus de ceux offerts par le module <code class=\"docutils literal notranslate\"><span class=\"pre\">logging</span></code> de 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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AdminEmailHandler</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include_html</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">email_backend</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.AdminEmailHandler\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ce gestionnaire envoie un courriel aux administrateurs du site pour chaque message de journal qu’il reçoit.</p>\n<p>If the log record contains a <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> attribute, the full details\nof the request will be included in the email. The email subject will\ninclude the phrase « internal IP » if the client’s IP address is in the\n<a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-INTERNAL_IPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INTERNAL_IPS</span></code></a> setting; if not, it will include « EXTERNAL IP ».</p>\n<p>Si la ligne de journal contient des informations sur une trace de débogage, celle-ci est incluse dans le courriel.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">include_html</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code> est utilisé pour contrôler si le courriel contenant la trace de débogage doit inclure une pièce jointe HTML contenant la page Web complète de débogage qui aurait été affichée si le réglage <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> valait <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Pour définir cette valeur dans votre configuration, incluez ce paramètre dans la définition du gestionnaire pour <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.log.AdminEmailHandler</span></code>, comme ceci :</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>Notez que cette version HTML du courriel contient une trace de débogage complète, avec les noms et valeurs des variables locales à chaque niveau de la trace, en plus des valeurs de vos réglages Django. Ces informations peuvent contenir des éléments très sensibles et il n’est pas toujours souhaitable de les envoyer par courriel. Envisagez l’utilisation d’un service comme <a class=\"reference external\" href=\"https://pypi.python.org/pypi/sentry\">Sentry</a> pour obtenir le meilleur des deux mondes, de riches informations avec des traces de débogage complètes, mais avec la sécurité de ne <em>pas</em> envoyer ces informations par messagerie. Vous pouvez aussi désigner explicitement certaines informations sensibles comme devant être exclues des rapports d’erreurs ; voir <a class=\"reference internal\" href=\"/fr/1.9/howto/error-reporting/#filtering-error-reports\"><span class=\"std std-ref\">Filtrage des rapports d’erreurs</span></a> pour plus de détails à ce sujet.</p>\n<p>En définissant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">email_backend</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code>, le <a class=\"reference internal\" href=\"/fr/1.9/topics/email/#topic-email-backends\"><span class=\"std std-ref\">moteur de messagerie</span></a> utilisé par le gestionnaire peut être surchargé, comme ceci :</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>Par défaut, c’est une instance du moteur de messagerie indiqué dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_BACKEND</span></code></a> qui est utilisée.</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\"><span class=\"pre\">send_mail</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">subject</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">message</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.AdminEmailHandler.send_mail\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"1.8\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p>Envoie des courriels aux utilisateurs administrateurs. Pour personnaliser ce comportement, vous pouvez créer une sous-classe de <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a> et surcharger cette méthode.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"id5\">\n<h3>Filtres<a class=\"heading-anchor\" href=\"#id5\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django propose deux filtres de journalisation en plus de ceux offerts par le module <code class=\"docutils literal notranslate\"><span class=\"pre\">logging</span></code> de Python.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.log.CallbackFilter\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CallbackFilter</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">callback</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.log.CallbackFilter\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ce filtre accepte une fonction de rappel (qui ne doit accepter qu’un seul paramètre, l’enregistrement à journaliser) et appelle celle-ci pour chaque enregistrement qui transite par ce filtre. Le traitement de l’enregistrement s’arrête si la fonction de rappel renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>Par exemple, pour exclure <a class=\"reference internal\" href=\"/fr/1.9/ref/exceptions/#django.http.UnreadablePostError\" title=\"django.http.UnreadablePostError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">UnreadablePostError</span></code></a> (généré lorsqu’un utilisateur annule un téléversement) des courriels envoyés aux administrateurs, cette fonction de filtre pourrait être créée :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UnreadablePostError</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">skip_unreadable_post</span><span class=\"p\">(</span><span class=\"n\">record</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">record</span><span class=\"o\">.</span><span class=\"n\">exc_info</span><span class=\"p\">:</span>\n        <span class=\"n\">exc_type</span><span class=\"p\">,</span> <span class=\"n\">exc_value</span> <span class=\"o\">=</span> <span class=\"n\">record</span><span class=\"o\">.</span><span class=\"n\">exc_info</span><span class=\"p\">[:</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">exc_value</span><span class=\"p\">,</span> <span class=\"n\">UnreadablePostError</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>puis ajoutée à la configuration de journalisation :</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> <span class=\"n\">skip_unreadable_post</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;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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RequireDebugFalse</span></span><a class=\"heading-anchor\" href=\"#django.utils.log.RequireDebugFalse\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ce filtre ne laisse passer les enregistrements que lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.DEBUG</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>Ce filtre est utilisé comme le montre l’exemple ci-dessous dans la configuration par défaut de <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> pour garantir que <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a> n’envoie des courriels d’erreur aux administrateurs que lorsque <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</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=\"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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RequireDebugTrue</span></span><a class=\"heading-anchor\" href=\"#django.utils.log.RequireDebugTrue\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ce filtre est similaire à <a class=\"reference internal\" href=\"#django.utils.log.RequireDebugFalse\" title=\"django.utils.log.RequireDebugFalse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequireDebugFalse</span></code></a>, sauf que les enregistrements ne sont retransmis que lorsque <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></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>Configuration de journalisation par défaut de Django<a class=\"heading-anchor\" href=\"#django-s-default-logging-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Par défaut, Django configure la journalisation suivante :</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>:</p>\n<ul class=\"simple\">\n<li><p>Le journaliseur « fourre-tout » <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> envoie tous les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou plus élevé vers la console.</p></li>\n<li><p>Le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">py.warnings</span></code> qui s’occupe des messages produits par <code class=\"docutils literal notranslate\"><span class=\"pre\">warnings.warn()</span></code>, envoie les messages vers la console.</p></li>\n</ul>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>:</p>\n<ul class=\"simple\">\n<li><p>Le journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> envoie les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code> à <a class=\"reference internal\" href=\"#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a>.</p></li>\n</ul>\n<aside class=\"version-note version-changed\" data-version=\"1.9\">\n<p class=\"version-note-title\">Changed in Django 1.9</p><p>La configuration de journalisation par défaut de Django a changé. Consultez les <a class=\"reference internal\" href=\"/fr/1.9/releases/1.9/#default-logging-changes-19\"><span class=\"std std-ref\">notes de publication</span></a> pour obtenir une description des modifications.</p>\n</aside>\n<p>Consultez aussi <a class=\"reference internal\" href=\"#configuring-logging\"><span class=\"std std-ref\">Configuration de la journalisation</span></a> pour savoir comment compléter ou remplacer cette configuration de journalisation par défaut.</p>\n</section>","rootId":"module-django.utils.log","toc":[{"title":"Une introduction rapide sur la journalisation","anchor":"a-quick-logging-primer","children":[{"title":"Les acteurs en jeu","anchor":"the-cast-of-players","children":[{"title":"Journaliseurs","anchor":"loggers","children":[]},{"title":"Gestionnaires","anchor":"handlers","children":[]},{"title":"Filtres","anchor":"filters","children":[]},{"title":"Formateurs","anchor":"formatters","children":[]}]}]},{"title":"La journalisation en pratique","anchor":"using-logging","children":[{"title":"Nommage des journaliseurs","anchor":"naming-loggers","children":[]},{"title":"Appels de journalisation","anchor":"making-logging-calls","children":[]}]},{"title":"Configuration de la journalisation","anchor":"configuring-logging","children":[{"title":"Exemples","anchor":"examples","children":[]},{"title":"Configuration personnalisée de la journalisation","anchor":"custom-logging-configuration","children":[]},{"title":"Désactivation de la configuration de journalisation","anchor":"disabling-logging-configuration","children":[]}]},{"title":"Extensions de journalisation de Django","anchor":"django-s-logging-extensions","children":[{"title":"Journaliseurs","anchor":"id3","children":[{"title":"django","anchor":"django","children":[]},{"title":"django.request","anchor":"django-request","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":"Gestionnaires","anchor":"id4","children":[]},{"title":"Filtres","anchor":"id5","children":[]}]},{"title":"Configuration de journalisation par défaut de Django","anchor":"django-s-default-logging-configuration","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/1.9/topics/"}],"prev":{"docname":"topics/i18n/timezones","title":"Fuseaux horaires","url":"/fr/1.9/topics/i18n/timezones/"},"next":{"docname":"topics/pagination","title":"Pagination","url":"/fr/1.9/topics/pagination/"},"formats":{"html":"/fr/1.9/topics/logging/","markdown":"/fr/1.9/topics/logging.md","json":"/fr/1.9/topics/logging.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/topics/logging.txt","official":"https://docs.djangoproject.com/fr/1.9/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","fr","ja","id","pt-br","es"]}