{"title":"Journalisation","version":"6.1","locale":"fr","docname":"topics/logging","url":"/fr/6.1/topics/logging/","canonical":"https://djangodocs.dev/fr/6.1/topics/logging/","summary":"Voir aussi Configuration et utilisation de la journalisation Référence de la journalisation dans Django Les programmeurs Python utilisent fréquemment print() dans…","html":"<span id=\"logging-explanation\"></span><h1>Journalisation<a class=\"heading-anchor\" href=\"#logging\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/6.1/howto/logging/#logging-how-to\"><span class=\"std std-ref\">Configuration et utilisation de la journalisation</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/6.1/ref/logging/#logging-ref\"><span class=\"std std-ref\">Référence de la journalisation dans Django</span></a></p></li>\n</ul>\n</aside>\n<p>Les programmeurs Python utilisent fréquemment <code class=\"docutils literal notranslate\"><span class=\"pre\">print()</span></code> dans leur code comme méthode rapide et pratique de débogage. L’utilisation de l’infrastructure de journalisation demande à peine plus d’effort que ça, mais c’est beaucoup plus élégant et souple. En plus d’être pratique pour le débogage, la journalisation peut aussi offrir plus d’information mieux structurée au sujet de l’état et de la santé de votre application.</p>\n<section id=\"overview\">\n<h2>Aperçu<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django utilise et étend 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 au niveau système. Ce module est abordé en détails dans la propre documentation de Python ; cette section fournit 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 (<em>handler</em>) 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 (<em>filter</em>) 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=\"security-implications\">\n<span id=\"logging-security-implications\"></span><h2>Implications quant à la sécurité<a class=\"heading-anchor\" href=\"#security-implications\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le système de journalisation traite de l’information potentiellement sensible. Par exemple, une entrée de journalisation peut contenir de l’information au sujet d’une requête web ou une trace d’erreur, alors que certaines données collectées dans vos propres journaliseurs peuvent aussi présenter des implications quant à la sécurité. Vous devez être sûr-e de savoir :</p>\n<ul class=\"simple\">\n<li><p>quelle information est collectée</p></li>\n<li><p>où celle-ci sera ensuite stockée</p></li>\n<li><p>comment va-t-elle être transférée</p></li>\n<li><p>qui pourra y avoir accès.</p></li>\n</ul>\n<p>Pour aider à contrôler la collecte des informations sensibles, vous pouvez explicitement désigner certaines informations comme sensibles pour qu’elles soient exclues des rapports d’erreurs – des informations plus complètes se trouvent dans <a class=\"reference internal\" href=\"/fr/6.1/howto/error-reporting/#filtering-error-reports\"><span class=\"std std-ref\">filtrage des rapports d’erreurs</span></a>.</p>\n<section id=\"adminemailhandler\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code><a class=\"heading-anchor\" href=\"#adminemailhandler\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La classe <a class=\"reference internal\" href=\"/fr/6.1/ref/logging/#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a> mérite d’être mentionnée dans un contexte de sécurité. Si son option <code class=\"docutils literal notranslate\"><span class=\"pre\">include_html</span></code> est activée, le courriel qu’elle envoie contiendra une trace d’erreur complète, avec les noms et les valeurs des variables locales à chaque niveau de la pile, en plus des valeurs de vos réglages Django (en d’autres termes, le même niveau de détail qui est exposé dans une page Web lorsque <a class=\"reference internal\" href=\"/fr/6.1/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<p>Il n’est généralement pas considéré comme une bonne idée d’envoyer de telles informations potentiellement sensibles par courriel. Considérez plutôt le recours à l’un des nombreux services tiers auxquels des journaux détaillés peuvent être envoyés pour obtenir le meilleur de plusieurs mondes – l’information riche de traces d’erreurs complètes, une gestion claire de qui est averti et peut accéder à l’information, et ainsi de suite.</p>\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>La bibliothèque de journalisation de Python fournit plusieurs techniques de configuration, que ce soit par interface programmable ou par des fichiers de configuration. Par défaut, Django utilise le <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\">format dictConfig</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/6.1/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/6.1/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=\"/fr/6.1/ref/logging/#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/6.1/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> (qui est la valeur par défaut <code class=\"docutils literal notranslate\"><span class=\"pre\">dictConfig</span></code> si la clé est manquante), 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/6.1/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>La documentation complète du <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\">format dictConfig</span></a> est la meilleure source d’informations concernant les dictionnaires de configuration de la journalisation. Cependant, pour vous donner un petit aperçu de ce qui est réalisable, voici quelques exemples.</p>\n<p>Pour commencer, voici une petite configuration qui permet d’afficher tous les messages de journal dans la console :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">import</span><span class=\"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=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;console&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.StreamHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;root&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;console&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;WARNING&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>Ceci configure le journaliseur parent <code class=\"docutils literal notranslate\"><span class=\"pre\">root</span></code> pour envoyer les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> ou plus élevé vers le gestionnaire de la console. En ajustant le niveau à <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>, vous pouvez afficher plus de messages. Ceci peut se révéler utile durant le développement.</p>\n<p>Ensuite, nous pouvons ajouter plus de journalisation fine. Voici un exemple sur la façon de faire produire plus de messages par le système de journalisation pour le journaliseur nommé spécifiquement <a class=\"reference internal\" href=\"/fr/6.1/ref/logging/#django-logger\"><span class=\"std std-ref\">django</span></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">import</span><span class=\"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=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;console&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.StreamHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;root&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;console&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;WARNING&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;console&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getenv</span><span class=\"p\">(</span><span class=\"s2\">&quot;DJANGO_LOG_LEVEL&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">),</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>Par défaut, cette configuration envoie les messages du journaliseur <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou plus élevé vers la console. Il s’agit du même niveau que dans 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 ces messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>. Cependant, avec cette 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<p>Vous n’êtes pas obligé d’envoyer la journalisation vers la console. Voici une configuration qui écrit toutes les journalisations provenant du journaliseur nommé <a class=\"reference internal\" href=\"/fr/6.1/ref/logging/#django-logger\"><span class=\"std std-ref\">django</span></a> dans un fichier local :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;file&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/path/to/django/debug.log&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;file&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\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>Finalement, voici un exemple d’une configuration de journalisation plutôt complexe :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;formatters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{asctime}</span><span class=\"s2\"> </span><span class=\"si\">{module}</span><span class=\"s2\"> </span><span class=\"si\">{process:d}</span><span class=\"s2\"> </span><span class=\"si\">{thread:d}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;simple&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;special&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;project.logging.SpecialFilter&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;require_debug_true&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;()&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.RequireDebugTrue&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;console&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;require_debug_true&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.StreamHandler&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;formatter&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;simple&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.utils.log.AdminEmailHandler&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;special&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;console&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;django.request&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ERROR&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;myproject.custom&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;console&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mail_admins&quot;</span><span class=\"p\">],</span>\n            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;INFO&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;filters&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;special&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>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 affiche 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>La chaîne <code class=\"docutils literal notranslate\"><span class=\"pre\">format</span></code> est une chaîne de format Python normale décrivant les détails de ce qui doit être affiché pour chaque ligne de journal. La liste complète des détails pouvant être affichés se trouve dans <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/6.1/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 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#logging.StreamHandler\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamHandler</span></code></a> affichant tout message de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> ou plus élevé vers la sortie d’erreur (<code class=\"docutils literal notranslate\"><span class=\"pre\">sys.stderr</span></code>). 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 <a class=\"reference internal\" href=\"/fr/6.1/ref/logging/#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a> qui avertit par courriel les <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> 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/6.1/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/6.1/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/6.1/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 de la <a class=\"reference internal\" href=\"/fr/6.1/ref/logging/#default-logging-configuration\"><span class=\"std std-ref\">journalisation par défaut de Django</span></a>.</p>\n<p>En définissant <a class=\"reference internal\" href=\"/fr/6.1/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<p>Voici un exemple qui désactive la configuration de la journalisation par défaut de Django, puis configure manuellement la journalisation :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"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\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>Notez que le processus de configuration par défaut n’appelle  <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-LOGGING_CONFIG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING_CONFIG</span></code></a> qu’une fois que les réglages sont complètement chargés. Par contraste, la configuration manuelle de la journalisation dans votre fichier de réglages va charger immédiatement la configuration de journalisation. En conséquence, votre configuration de journalisation doit apparaître <em>après</em> tout réglage dont elle dépend.</p>\n</section>\n</section>","rootId":"logging","toc":[{"title":"Aperçu","anchor":"overview","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":"Implications quant à la sécurité","anchor":"security-implications","children":[{"title":"AdminEmailHandler","anchor":"adminemailhandler","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":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/6.1/topics/"}],"prev":{"docname":"topics/i18n/timezones","title":"Fuseaux horaires","url":"/fr/6.1/topics/i18n/timezones/"},"next":{"docname":"topics/pagination","title":"Pagination","url":"/fr/6.1/topics/pagination/"},"formats":{"html":"/fr/6.1/topics/logging/","markdown":"/fr/6.1/topics/logging.md","json":"/fr/6.1/topics/logging.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/logging.txt","official":"https://docs.djangoproject.com/fr/6.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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}