{"title":"Come configurare ed utilizzare i log","version":"5.2","locale":"it","docname":"howto/logging","url":"/it/5.2/howto/logging/","canonical":"https://djangodocs.dev/it/5.2/howto/logging/","summary":"Vedi anche riferimento del sistema di logging di Django Panoramica del logging di Django Django offre una configurazione predefinita di logging funzionante che può…","html":"<span id=\"logging-how-to\"></span><h1>Come configurare ed utilizzare i log<a class=\"heading-anchor\" href=\"#how-to-configure-and-use-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Vedi anche</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/it/5.2/ref/logging/#logging-ref\"><span class=\"std std-ref\">riferimento del sistema di logging di Django</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/it/5.2/topics/logging/#logging-explanation\"><span class=\"std std-ref\">Panoramica del logging di Django</span></a></p></li>\n</ul>\n</aside>\n<p>Django offre una <a class=\"reference internal\" href=\"/it/5.2/ref/logging/#default-logging-configuration\"><span class=\"std std-ref\">configurazione predefinita di logging</span></a> funzionante che può essere prontamente estesa.</p>\n<section id=\"make-a-basic-logging-call\">\n<h2>Esegui una chiamata di base al sistema di log<a class=\"heading-anchor\" href=\"#make-a-basic-logging-call\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Per inviare un messaggio di log dal tuo codice, inserisci una chiamata di logging.</p>\n<aside class=\"admonition-don-t-be-tempted-to-use-logging-calls-in-settings-py admonition\">\n<p class=\"admonition-title\">Non utilizzare le chiamate al sistema di log all’interno di <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code>.</p>\n<p>Il modo in cui il logging di Django è configurato come parte della funzione <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> significa che le chiamate di logging poste in <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> potrebbero non funzionare come ci si aspetta, perchè <em>il logging non sarà pronto a quel punto</em>. Per esplorare il logging, usa una funzione di view come suggerito nell’esempio qui sotto.</p>\n</aside>\n<p>Prima, importa la libreria di logging di Python e poi ottieni una istanza di logger con <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.getLogger\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">logging.getLogger()</span></code></a>. Fornisci il metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">getLogger()</span></code> con un nome che lo identifica ed i record che emette. Una buona opzione è usare <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code> (vedi <a class=\"reference internal\" href=\"#naming-loggers\"><span class=\"std std-ref\">Usa lo spazio dei nomi del logger</span></a> qui sotto per saperne di più) che offrirà il nome del modulo Python corrente come percorso puntato:</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>E” una buona convenzione eseguire questa dichiarazione a livello di modulo.</p>\n<p>E quindi in una funzione, per esempio in una vista, invia un record al sistema di logging:</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>Quando questo codice viene eseguito, verrà inviato al logger un <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> contenente quel messaggio. Se stai usando la configurazione di logging predefinita di Django, il messaggio apparirà sulla console.</p>\n<p>Il livello <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> usato nell’esempio qui sopra è uno dei molti <a class=\"reference internal\" href=\"/it/5.2/topics/logging/#topic-logging-parts-loggers\"><span class=\"std std-ref\">livelli di severità del logging</span></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code>. Così, un altro esempio potrebbe essere:</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\">Importante</p>\n<p>I record con un livello più basso di <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> non appariranno in console di default. Cambiare questo comportamento richiede configurazioni aggiuntive.</p>\n</aside>\n</section>\n<section id=\"customize-logging-configuration\">\n<h2>Personalizza la configurazione del sistema di log<a class=\"heading-anchor\" href=\"#customize-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Anche se la configurazione di logging di Django funziona da sè, puoi controllare esattamente come i tuoi log sono inviati a varie destinazioni - ai file di log, servizi esterni, email e così via - con qualche configurazione aggiuntiva.</p>\n<p>Puoi configurare:</p>\n<ul class=\"simple\">\n<li><p>la mappatura del logger, per determinare quale record deve essere inviato a quale gestore</p></li>\n<li><p>i gestori, per determinare cosa devono fare con i log che ricevono</p></li>\n<li><p>i filtri, per fornire un controllo addizionale sul trasferimento dei record e eventualmente per effettuare delle modifiche al volo</p></li>\n<li><p>formattatori, per convertire oggetti <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> a stringa o altre forme per il consumo da parte degli umani o di un altro sistema.</p></li>\n</ul>\n<p>Ci sono diversi modi di configurare il logging. In Django, l’impostazione <a class=\"reference internal\" href=\"/it/5.2/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> viene usata più comunemente. L’impostazione usa il <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">formato dictConfig</span></a> ed estende la  <a class=\"reference internal\" href=\"/it/5.2/ref/logging/#default-logging-definition\"><span class=\"std std-ref\">configurazione di logging di default</span></a>.</p>\n<p>Vedi <a class=\"reference internal\" href=\"/it/5.2/topics/logging/#configuring-logging\"><span class=\"std std-ref\">Configuring logging</span></a> per una spiegazione di come le tue impostazioni personalizzate vengono fuse con le impostazioni predefinite di Django.</p>\n<p>Vedi la <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.config.html#module-logging.config\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">documentazione</span> <span class=\"pre\">del</span> <span class=\"pre\">logging</span> <span class=\"pre\">di</span> <span class=\"pre\">Python</span></code></a> per avere dettagli su altri modi di configurare il logging. Per amor di semplicità, questa documentazione considererà solamente la configurazione tramite l’impostazione <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>Configurazione di base del sistema di log<a class=\"heading-anchor\" href=\"#basic-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Quando si configurano i log, ha senso fare</p>\n<section id=\"create-a-logging-dictionary\">\n<h4>Creare un dizionario di <code class=\"docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code><a class=\"heading-anchor\" href=\"#create-a-logging-dictionary\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Nel tuo <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>Ha quasi sempre senso trattenere ed estendere la configurazione di logging predefinita impostando <code class=\"docutils literal notranslate\"><span class=\"pre\">disable_existing_loggers</span></code> a <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</section>\n<section id=\"configure-a-handler\">\n<h4>Configura un gestore<a class=\"heading-anchor\" href=\"#configure-a-handler\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Questo esempio configura un singolo handler chiamato <code class=\"docutils literal notranslate\"><span class=\"pre\">file</span></code>, che usa il <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#logging.FileHandler\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileHandler</span></code></a> di Python per salvare i log con livello <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> e superiore sul file <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> (nella radice del progetto):</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>Differenti classi handler accettano differenti opzioni di configurazione. Per avere più informazioni sulle classi handler disponibili, vedi <a class=\"reference internal\" href=\"/it/5.2/ref/logging/#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AdminEmailHandler</span></code></a>, fornita da Django e le varie various <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.handlers.html#module-logging.handlers\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">classi</span> <span class=\"pre\">handler</span></code></a> fornite da Python.</p>\n<p>I livelli di log possono essere anche configurati sul gestore (di default, accettano log di tutti i livelli). Usando l’esempio precedente, aggiungendo:</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>definirebbe una configurazione di gestione che accetta solo record di livello <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> e superiore.</p>\n</section>\n<section id=\"configure-a-logger-mapping\">\n<h4>Configura la mappatura del sistema di log<a class=\"heading-anchor\" href=\"#configure-a-logger-mapping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Per inviare record a questo handler, configurare una mappatura del logger per usarlo ad esempio:</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>Il nome del mapping determina quali record di log elaborerà. Questa configurazione (<code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code>) è <em>senza nome</em>. Questo significa che elaborerà record da <em>tutti</em> i logger (vedi <a class=\"reference internal\" href=\"#naming-loggers\"><span class=\"std std-ref\">Usa lo spazio dei nomi del logger</span></a> qua sotto per sapere come usare il nome di mapping per determinare i logger per i quali processerà i record).</p>\n<p>Questo inoltrerà i messaggi di livello <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> e superiore all’handler chiamato <code class=\"docutils literal notranslate\"><span class=\"pre\">file</span></code>.</p>\n<p>Nota che un logger può inoltrare messaggi a più gestori, così la relazione tra logger e gestori è molti-a-molti.</p>\n<p>Se esegui:</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>nel tuo codice, troverai quel messaggio nel file <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> nella radice del progetto.</p>\n</section>\n<section id=\"configure-a-formatter\">\n<h4>Configurare un formatter<a class=\"heading-anchor\" href=\"#configure-a-formatter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Di default, l’output finale del log contiene la parte di messaggio di ogni  <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">record</span> <span class=\"pre\">di</span> <span class=\"pre\">log</span></code></a>. Usa un formattatore se vuoi includere dati aggiuntivi. Prima di tutto nomina e definisci i tuoi formattatori - questo esempio definisce formattatori di nome <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose</span></code> e``simple``:</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>La keyword <code class=\"docutils literal notranslate\"><span class=\"pre\">style</span></code> ti permette di specificare  <code class=\"docutils literal notranslate\"><span class=\"pre\">{</span></code> per <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> o <code class=\"docutils literal notranslate\"><span class=\"pre\">$</span></code> per la formattazione <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">string.Template;</span> <span class=\"pre\">quello</span> <span class=\"pre\">predefinito</span> <span class=\"pre\">è</span> <span class=\"pre\">``$`</span></code>.</p>\n<p>Vedi <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logrecord-attributes\" title=\"(in Python v3.14)\"><span>LogRecord attributes</span></a> per gli attributi di <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> che puoi includere.</p>\n<p>Per applicare un formattatore ad un gestore, aggiungi una voce <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> al dizionario del gestore, che faccia riferimento al formattatore per nome, per esempio:</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>Usa lo spazio dei nomi del logger<a class=\"heading-anchor\" href=\"#use-logger-namespacing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La configurazione di logging senza nome <code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code> cattura log da ogni applicazione Python. Una configurazione di logging con nome catturerà log solo dai logger con nomi che combaciano.</p>\n<p>Il namespace di una istanza di un logger è definita usando <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.getLogger\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">getLogger()</span></code></a>. Per esempio in <code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code> di <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>creerà un logger nel namespace <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> namespace.  <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code> ti permette di organizzare i messaggi di log in accordo con la loro provenienza nelle applicazioni del tuo progetto in modo automatico. Assicura anche che non ci siano collisioni sui nomi.</p>\n<p>Un mapping di logger chiamato <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> catturerà record da questo logger:</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>Un mapping di logger chiamato <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> sarà più permissivo, catturando record dai logger che si trovino ovunque nel namespace <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> (incluso <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.utils</span></code> e così via):</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>Puoi anche definire esplicitamente i namespacing del logger:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>e impostare le mappature del logger di conseguenza.</p>\n<section id=\"using-logger-hierarchies-and-propagation\">\n<span id=\"naming-loggers-hierarchy\"></span><h5>Utilizzo di gerarchie di logger e propagazione<a class=\"heading-anchor\" href=\"#using-logger-hierarchies-and-propagation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>La nomenclatura dei logger è <em>gerarchica</em>.  <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> è genitore di <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>, che è genitore di <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code>. Finchè non specificato altrimenti, i mapping dei logger propagheranno i record che elaborano ai loro genitori - un record da un logger nel namespace <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> sarà gestito da entrambi i mapping di <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>.</p>\n<p>Per gestire questo comportamento, imposta la chiave di propagazione sulle mappature che definisci:</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> è di dafault a <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. In questo esempio, i log da  <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views.private</span></code> non saranno gestiti dal genitore, ma i log da <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> lo saranno.</p>\n</section>\n</section>\n</section>\n<section id=\"configure-responsive-logging\">\n<h3>Configura logging reattivi<a class=\"heading-anchor\" href=\"#configure-responsive-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il logging è soprattutto utile quando contiene più informazioni possibili ma non le informazioni di cui non hai bisogno - e di quanto hai bisogno dipende da quel che stai facendo. Quando stai facendo debug, hai bisogno di un livello di informazioni che sarebbe eccessivo ed inutile se fossi in produzione.</p>\n<p>Puoi configurare il loggin per fornirti il livello di dettaglio di cui necessiti, quando ne hai bisogno. Piuttosto che cambiare manualmente la configurazione per fare questo, un modo migliore è applicare la configurazione automaticamente a seconda dell’environment.</p>\n<p>Per esempio, potresti impostare una variabile d’ambiente appropriata <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_LOG_LEVEL</span></code> nei tuoi ambienti di sviluppo e staging ed usarla nel mapping del logger, quindi:</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>- così che, fintanto che l’ambiente non specifica un livello di log più basso, questa configurazione girerà solo i record di severità <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> e superiore al proprio gestore.</p>\n<p>Altre opzioni nella configurazione (come le opzioni del gestore <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> o <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code>) possono essere gestite in modo simile.</p>\n</section>\n</section>","rootId":"how-to-configure-and-use-logging","toc":[{"title":"Esegui una chiamata di base al sistema di log","anchor":"make-a-basic-logging-call","children":[]},{"title":"Personalizza la configurazione del sistema di log","anchor":"customize-logging-configuration","children":[{"title":"Configurazione di base del sistema di log","anchor":"basic-logging-configuration","children":[{"title":"Creare un dizionario di LOGGING","anchor":"create-a-logging-dictionary","children":[]},{"title":"Configura un gestore","anchor":"configure-a-handler","children":[]},{"title":"Configura la mappatura del sistema di log","anchor":"configure-a-logger-mapping","children":[]},{"title":"Configurare un formatter","anchor":"configure-a-formatter","children":[]},{"title":"Usa lo spazio dei nomi del logger","anchor":"use-logger-namespacing","children":[{"title":"Utilizzo di gerarchie di logger e propagazione","anchor":"using-logger-hierarchies-and-propagation","children":[]}]}]},{"title":"Configura logging reattivi","anchor":"configure-responsive-logging","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/it/5.2/howto/"}],"prev":{"docname":"howto/static-files/index","title":"Come gestire file statici (Es. immagini, JavaScript, CSS)","url":"/it/5.2/howto/static-files/"},"next":{"docname":"howto/error-reporting","title":"Come gestire il report degli errori","url":"/it/5.2/howto/error-reporting/"},"formats":{"html":"/it/5.2/howto/logging/","markdown":"/it/5.2/howto/logging.md","json":"/it/5.2/howto/logging.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/howto/logging.txt","official":"https://docs.djangoproject.com/it/5.2/howto/logging/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}