<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Javier Rodriguez</title>
    <description>The latest articles on DEV Community by Javier Rodriguez (@javicerodriguez).</description>
    <link>https://dev.to/javicerodriguez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F518659%2F6e6df991-39e4-4cb5-888d-92dee8ad525f.jpg</url>
      <title>DEV Community: Javier Rodriguez</title>
      <link>https://dev.to/javicerodriguez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/javicerodriguez"/>
    <language>en</language>
    <item>
      <title>Logging con Python</title>
      <dc:creator>Javier Rodriguez</dc:creator>
      <pubDate>Sun, 13 Oct 2024 13:38:14 +0000</pubDate>
      <link>https://dev.to/javicerodriguez/logging-con-python-2j7m</link>
      <guid>https://dev.to/javicerodriguez/logging-con-python-2j7m</guid>
      <description>&lt;p&gt;Logs, logging. Qué es y como registrar eventos con Python&lt;/p&gt;

&lt;p&gt;Crear logs utilizando logging nos permite un montón de funcionalidades y flexibilidad en el código. En este breve artículo te muestro lo básico y un poco más para empezar a incorporarlo en tus proyectos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es logging? Y un log?
&lt;/h2&gt;

&lt;p&gt;Logging es una forma de monitorear eventos. Estos eventos son visibles mediante un mensaje descriptivo, con cierta información variable (el valor de alguna variable o el resultado de una función) y con cierto nivel de importancia.&lt;br&gt;
Un log es como un print en Python, pero la diferencia es que no necesariamente se imprimen en pantalla y pueden guardar estos registros en algún archivo conocido.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo lo puedo usar?
&lt;/h2&gt;

&lt;p&gt;Usaremos la librería logging, que ya viene de forma nativa en Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;log-de-hoy.log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s %(levelname)s %(message)s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
        &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adding &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The values should be numeric&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 5
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# None
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si ejecutamos esto, se genera un archivo llamado &lt;code&gt;log-de-hoy.log&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;2023-12-08 11:56:30,544 INFO Adding 2 and 3. Result: 5
2023-12-08 11:56:30,544 ERROR The values should be numeric
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explicación
&lt;/h2&gt;

&lt;p&gt;👉🏻 Iniciamos configuración básica: con &lt;code&gt;logging.basicConfig&lt;/code&gt; declaramos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;filename&lt;/code&gt;: nombre del archivo en particular que queramos agregar los registros (para el ejemplo el nombre es &lt;code&gt;log-de-hoy.log&lt;/code&gt;, pero lo ideal es que tenga un nombre descriptivo con la fecha del día)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;encoding&lt;/code&gt;: tipo de formato en el que guardamos cada log&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;level&lt;/code&gt;: definimos desde que nivel queremos observar. Los diferentes niveles están en su &lt;a href="https://docs.python.org/3/library/logging.html#logging-levels" rel="noopener noreferrer"&gt;documentación&lt;/a&gt; y vas a ver que tienen un valor numérico, siendo &lt;code&gt;logging.INFO&lt;/code&gt; un 20. Si necesitamos &lt;em&gt;debugguear&lt;/em&gt;, al menos necesito un 10. Entonces, con &lt;code&gt;logging.DEBUG&lt;/code&gt; nos aseguramos que niveles con valor 10 en adelante se registren.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;format&lt;/code&gt;: formato en la que se registran los logs, en este caso es &lt;code&gt;fecha nivel mensaje&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉🏻 Registramos el resultado de la suma con nivel &lt;code&gt;info&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;👉🏻 Registramos el error de sumar un int y un string con nivel &lt;code&gt;error&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Para qué usar logging?
&lt;/h2&gt;

&lt;p&gt;Tal vez ya te lo puedas imaginar, ya que es una herramienta poderosa que nos va a ayudar a identificar anomalías rápidamente. Algunos de los casos de usos para usarlo son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐞 Debugging y troubleshooting&lt;/li&gt;
&lt;li&gt;📈 Monitoreo y análisis de performance&lt;/li&gt;
&lt;li&gt;🏢 Auditoría y compliance&lt;/li&gt;
&lt;li&gt;👮 Seguridad y detección de anomalías&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Para terminar…
&lt;/h2&gt;

&lt;p&gt;Es fácil de implementar, no? Es un re plus integrarlo en cualquier proyecto y dejar de usar tantos prints 😉.&lt;/p&gt;

&lt;p&gt;El módulo logging ofrece mucho más de lo poco que mostré acá. Pero esto poco es más que suficiente! De ser necesario, la documentación explica bastante bien otros casos, métodos, configs y demás.&lt;/p&gt;

</description>
      <category>python</category>
      <category>logging</category>
    </item>
  </channel>
</rss>
