{"title":"Configuration et utilisation de la journalisation","version":"5.1","locale":"fr","docname":"howto/logging","url":"/fr/5.1/howto/logging/","canonical":"https://djangodocs.dev/fr/5.1/howto/logging/","summary":"Voir aussi Référence de la journalisation dans Django Aperçu de la journalisation dans Django Django contient une configuration de journalisation par défaut…","html":"<span id=\"logging-how-to\"></span><h1>Configuration et utilisation de la journalisation<a class=\"heading-anchor\" href=\"#how-to-configure-and-use-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/5.1/ref/logging/#logging-ref\"><span class=\"std std-ref\">Référence de la journalisation dans Django</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/5.1/topics/logging/#logging-explanation\"><span class=\"std std-ref\">Aperçu de la journalisation dans Django</span></a></p></li>\n</ul>\n</aside>\n<p>Django contient une <a class=\"reference internal\" href=\"/fr/5.1/ref/logging/#default-logging-configuration\"><span class=\"std std-ref\">configuration de journalisation par défaut</span></a> fonctionnelle qui peut facilement être étendue.</p>\n<section id=\"make-a-basic-logging-call\">\n<h2>Appel de journalisation basique<a class=\"heading-anchor\" href=\"#make-a-basic-logging-call\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour envoyer un message de journalisation à partir de votre code, écrivez un appel de journalisation.</p>\n<aside class=\"admonition-don-t-be-tempted-to-use-logging-calls-in-settings-py admonition\">\n<p class=\"admonition-title\">Ne soyez pas tenté-e-s d’utiliser des appels de journalisation dans <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code>.</p>\n<p>La façon dont la journalisation de Django est configuré dans le cadre de la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> signifie que les appels de journalisation placés dans <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> peuvent ne pas fonctionner comme prévu, car la <em>journalisation n’est pas encore configurée à ce stade</em>. Pour explorer la journalisation, utilisez une fonction de vue comme suggéré dans l’exemple ci-dessous.</p>\n</aside>\n<p>Tout d’abord, importez la bibliothèque Python <code class=\"docutils literal notranslate\"><span class=\"pre\">logging</span></code> et obtenez une instance de journalisation avec <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>. Passez à la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">getLogger()</span></code> un nom pour l’identifier et pour les lignes qu’il produira. Une bonne option est d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code> (voir <a class=\"reference internal\" href=\"#naming-loggers\"><span class=\"std std-ref\">Utilisation de l’espace de noms des journaliseurs</span></a> ci-dessous pour en savoir plus), ce qui donnera le nom du module Python actuel sous forme de chemin pointé</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">logging</span>\n\n<span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Par convention, il est bon d’effectuer cette déclaration au niveau du module.</p>\n<p>Puis dans une fonction, par exemple dans une vue, envoyez un enregistrement au 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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">if</span> <span class=\"n\">some_risky_state</span><span class=\"p\">:</span>\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s2\">&quot;Platform is running at risk&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Lorsque ce code est exécuté, un objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> contenant ce message sera envoyé au journaliseur. SI vous utilisez la configuration de journalisation de Django par défaut, le message apparaîtra dans la console.</p>\n<p>Le niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> utilisé dans l’exemple ci-dessus est l’un des quelques <a class=\"reference internal\" href=\"/fr/5.1/topics/logging/#topic-logging-parts-loggers\"><span class=\"std std-ref\">niveaux de sévérité de journalisation</span></a>: DEBUG`, <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code>. Un autre exemple pourrait être</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">critical</span><span class=\"p\">(</span><span class=\"s2\">&quot;Payment system is not responding&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-important\">\n<p class=\"admonition-title\">Important</p>\n<p>Les enregistrements ayant un niveau plus faible que <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> n’apparaîtront pas dans la console par défaut. La modification de ce comportement nécessite une configuration supplémentaire.</p>\n</aside>\n</section>\n<section id=\"customize-logging-configuration\">\n<h2>Personnalisation de la configuration de journalisation<a class=\"heading-anchor\" href=\"#customize-logging-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Même si la configuration de journalisation de Django fonctionne telle quelle, vous pouvez contrôler exactement la manière dont vos journaux sont envoyés à diverses destinations, vers des fichiers journaux, des services externes, par courriel, etc. en ajoutant un peu de configuration supplémentaire.</p>\n<p>Vous pouvez configurer :</p>\n<ul class=\"simple\">\n<li><p>les correspondances des journaliseurs (logger) pour déterminer quels enregistrements sont envoyés à quels gestionnaires</p></li>\n<li><p>les gestionnaires (handler) pour déterminer ce qu’ils font des enregistrements qu’ils reçoivent</p></li>\n<li><p>les filtres, pour ajouter du contrôle supplémentaire sur le transfert des enregistrements, et même les modifier sur place</p></li>\n<li><p>les formateurs, pour convertir les objets <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> en une chaîne ou toute autre forme qui soit lisible par les humains ou un autre système</p></li>\n</ul>\n<p>Il existe plusieurs manières de configurer la journalisation. Dans Django, le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> est le plus couramment utilisé. Ce réglage 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>, et étend la <a class=\"reference internal\" href=\"/fr/5.1/ref/logging/#default-logging-definition\"><span class=\"std std-ref\">configuration de journalisation par défaut</span></a>.</p>\n<p>Consultez <a class=\"reference internal\" href=\"/fr/5.1/topics/logging/#configuring-logging\"><span class=\"std std-ref\">Configuration de la journalisation</span></a> pour une explication sur la manière dont vos réglages personnalisés sont fusionnés avec ceux de Django.</p>\n<p>Consultez la <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#module-logging.config\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">documentation</span> <span class=\"pre\">de</span> <span class=\"pre\">journalisation</span> <span class=\"pre\">de</span> <span class=\"pre\">Python</span></code></a> pour plus de détails sur les autres manières de configurer la journalisation. Par simplification, cette documentation ne va considérer que la configuration au travers du réglage <code class=\"docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code>.</p>\n<section id=\"basic-logging-configuration\">\n<span id=\"basic-logger-configuration\"></span><h3>Configuration de journalisation basique<a class=\"heading-anchor\" href=\"#basic-logging-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lors de la configuration de la journalisation, il est raisonnable de</p>\n<section id=\"create-a-logging-dictionary\">\n<h4>Créer un dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code><a class=\"heading-anchor\" href=\"#create-a-logging-dictionary\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Dans votre fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>  <span class=\"c1\"># the dictConfig format version</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>  <span class=\"c1\"># retain the default loggers</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Il est presque toujours recommandé de conserver et étendre la configuration de journalisation par défaut en définissant <code class=\"docutils literal notranslate\"><span class=\"pre\">disable_existing_loggers</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</section>\n<section id=\"configure-a-handler\">\n<h4>Configurer un gestionnaire<a class=\"heading-anchor\" href=\"#configure-a-handler\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Cet exemple configure un seul gestionnaire (handler) nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">file</span></code>, qui utilise la classe <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#logging.FileHandler\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileHandler</span></code></a> de Python pour enregistrer les journaux de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> et plus élevé dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> (à la racine du projet) :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;file&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Différentes classes de gestionnaire acceptent différentes options de configuration. Pour plus d’informations sur les classes de gestionnaire disponibles, consultez <a class=\"reference internal\" href=\"/fr/5.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> fournie par Django et les diverses <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#module-logging.handlers\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">classes</span> <span class=\"pre\">de</span> <span class=\"pre\">gestionnaire</span></code></a> fournies par Python.</p>\n<p>Les niveaux de journalisation peuvent aussi être définis sur les gestionnaires (par défaut, elles acceptent des messages de tous les niveaux). En utilisant l’exemple ci-dessus, l’ajout de :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"p\">{</span>\n    <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>définirait une configuration de gestionnaire n’acceptant que des enregistrements de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> ou supérieur.</p>\n</section>\n<section id=\"configure-a-logger-mapping\">\n<h4>Configuration d’une correspondance de journaliseur<a class=\"heading-anchor\" href=\"#configure-a-logger-mapping\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour envoyer des enregistrements à ce gestionnaire, configurez une correspondance pour l’utiliser, par 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=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;file&quot;</span><span class=\"p\">],</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Le nom de correspondance détermine quels sont les enregistrements de journaux qu’il va traiter. Cette configuration (<code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code>) is <em>anonyme</em>. Cela signifie qu’elle traitera les enregistrements de <em>tous</em> les journaliseurs (voir <a class=\"reference internal\" href=\"#naming-loggers\"><span class=\"std std-ref\">Utilisation de l’espace de noms des journaliseurs</span></a> ci-dessous sur la manière d’utiliser les noms de correspondance pour déterminer les journaliseurs concernés par le traitement de ses enregistrements).</p>\n<p>Ceci va transmettre les messages de niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> et supérieur au gestionnaire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">file</span></code>.</p>\n<p>Notez qu’un journaliseur peut transmettre des messages à plusieurs gestionnaires, il existe donc une relation de type plusieurs-à-plusieurs entre les journaliseurs et les gestionnaires.</p>\n<p>Si vous exécutez</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attempting to connect to API&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>dans vote code, vous trouverez ce message dans le fichier general.log` à la racine de votre projet.</p>\n</section>\n<section id=\"configure-a-formatter\">\n<h4>Configuration d’un formateur<a class=\"heading-anchor\" href=\"#configure-a-formatter\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Par défaut, le résultat final de journalisation contient la partie message de chaque <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">enregistrement</span> <span class=\"pre\">de</span> <span class=\"pre\">journal</span></code></a>. Utilisez un formateur si vous souhaitez inclure des données supplémentaires. Commencez par nommer et définir vos formateurs. Cet exemple définit des formateurs nommés  <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">simple</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;formatters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{name}</span><span class=\"s2\"> </span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{asctime}</span><span class=\"s2\"> </span><span class=\"si\">{module}</span><span class=\"s2\"> </span><span class=\"si\">{process:d}</span><span class=\"s2\"> </span><span class=\"si\">{thread:d}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;simple&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Le mot-clé <code class=\"docutils literal notranslate\"><span class=\"pre\">style</span></code> permet d’indiquer <code class=\"docutils literal notranslate\"><span class=\"pre\">{</span></code> pour la mise en forme <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">$</span></code> pour <a class=\"reference external\" href=\"https://docs.python.org/3/library/string.html#string.Template\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">string.Template</span></code></a>; la valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">$</span></code>.</p>\n<p>Voir <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logrecord-attributes\" title=\"(disponible dans Python v3.14)\"><span>LogRecord attributes</span></a> au sujet des attributs de <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> qu’il est possible d’inclure.</p>\n<p>Pour appliquer un formateur à un gestionnaire, ajoutez une entrée <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> au dictionnaire du gestionnaire en vous référant au formateur par son nom, par 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=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;file&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;formatter&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">,</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"use-logger-namespacing\">\n<span id=\"naming-loggers\"></span><h4>Utilisation de l’espace de noms des journaliseurs<a class=\"heading-anchor\" href=\"#use-logger-namespacing\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La configuration de journalisation anonyme <code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code> capture les journaux de n’importe quelle application Python. Une configuration de journalisation nommée ne capturera que les journaux de journaliseurs dont le nom correspond.</p>\n<p>L’espace de noms d’une instance de journaliseur est défini en utilisant <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\">getLogger()</span></code></a>. Par exemple, dans <code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>va créer un journaliseur dans l’espace de noms <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code> permet d’organiser automatiquement les messages de journalisation en fonction de leur provenance dans les applications de votre projet. Cela garantit par la même occasion que les collisions de noms seront évitées.</p>\n<p>Une correspondance de journaliseur nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> va capturer les enregistrements de ce journaliseur :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;my_app.views&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">},</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Une correspondance de journaliseur nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> sera plus permissive, capturant les enregistrements de journaliseurs partout dans l’espace de noms <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> (y compris my_app.views`, <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.utils</span></code> et ainsi de suite) :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;my_app&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">},</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Il est aussi possible de définir les espaces de noms des journaliseurs de manière explicite</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"s2\">&quot;project.payment&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>et de définir ensuite en fonction les correspondances de journaliseurs.</p>\n<section id=\"using-logger-hierarchies-and-propagation\">\n<span id=\"naming-loggers-hierarchy\"></span><h5>Utilisation des hiérarchies et de la propagation des journaliseurs<a class=\"heading-anchor\" href=\"#using-logger-hierarchies-and-propagation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>La nomenclature des journaliseurs est <em>hiérarchique</em>. <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> est le parent de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>, qui est le parent de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code>. Sans autre indication, les correspondances de journaliseurs vont propager les enregistrements qu’elles traitent à leurs parents ; un enregistrement d’un journaliseur dans l’espace de noms <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> sera traité à la fois par les correspondances de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> et de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>.</p>\n<p>Pour contrôler ce comportement, donnez une valeur à la clé de propagation sur les correspondances que vous définissez</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;my_app&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;my_app.views&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;my_app.views.private&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">propagate</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> par défaut. Dans cet exemple, les journaux de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> ne seront pas traités par les parents, mais les journaux de <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> le seront.</p>\n</section>\n</section>\n</section>\n<section id=\"configure-responsive-logging\">\n<h3>Configuration de journalisation réactive<a class=\"heading-anchor\" href=\"#configure-responsive-logging\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La journalisation est d’autant plus utile qu’elle contient des informations riches, mais sans information inutile, et cette pesée d’intérêts dépend de ce que vous faites. Lorsque vous êtes en mode débogage, le niveau d’informations souhaité dépasse largement ce qui sera nécessaire lorsque vous passerez votre projet en production.</p>\n<p>Vous pouvez configurer la journalisation pour qu’elle vous offre le niveau de détail nécessaire au moment où vous en avez besoin. Au lieu de modifier manuellement la configuration pour cet objectif, une meilleure façon est d’appliquer une configuration automatiquement en fonction de l’environnement.</p>\n<p>Par exemple, vous pouvez définir une variable d’environnement <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_LOG_LEVEL</span></code> appropriée dans vos environnements de développement et de pré-production, et en faire usage dans une configuration de journaliseur de cette façon</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getenv</span><span class=\"p\">(</span><span class=\"s2\">&quot;DJANGO_LOG_LEVEL&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;WARNING&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>de cette manière, tant que l’environnement n’indique par un niveau de journalisation plus bas, cette configuration ne propagera que les enregistrements de sévérité <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> et supérieure à son gestionnaire.</p>\n<p>D’autres options de la configuration (comme les options <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> des gestionnaires) peuvent également être ajustées de cette façon.</p>\n</section>\n</section>","rootId":"how-to-configure-and-use-logging","toc":[{"title":"Appel de journalisation basique","anchor":"make-a-basic-logging-call","children":[]},{"title":"Personnalisation de la configuration de journalisation","anchor":"customize-logging-configuration","children":[{"title":"Configuration de journalisation basique","anchor":"basic-logging-configuration","children":[{"title":"Créer un dictionnaire LOGGING","anchor":"create-a-logging-dictionary","children":[]},{"title":"Configurer un gestionnaire","anchor":"configure-a-handler","children":[]},{"title":"Configuration d’une correspondance de journaliseur","anchor":"configure-a-logger-mapping","children":[]},{"title":"Configuration d’un formateur","anchor":"configure-a-formatter","children":[]},{"title":"Utilisation de l’espace de noms des journaliseurs","anchor":"use-logger-namespacing","children":[{"title":"Utilisation des hiérarchies et de la propagation des journaliseurs","anchor":"using-logger-hierarchies-and-propagation","children":[]}]}]},{"title":"Configuration de journalisation réactive","anchor":"configure-responsive-logging","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Guides pratiques","url":"/fr/5.1/howto/"}],"prev":{"docname":"howto/static-files/index","title":"Gestion des fichiers statiques (par ex. images, JavaScript, CSS)","url":"/fr/5.1/howto/static-files/"},"next":{"docname":"howto/error-reporting","title":"Gestion du signalement des erreurs","url":"/fr/5.1/howto/error-reporting/"},"formats":{"html":"/fr/5.1/howto/logging/","markdown":"/fr/5.1/howto/logging.md","json":"/fr/5.1/howto/logging.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/howto/logging.txt","official":"https://docs.djangoproject.com/fr/5.1/howto/logging/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}