Logging en Python: aprender a usarlo y abandonar por completo los prints.

25/10/2017 | Autor: Eduardo Enriquez

Hay que abandonar los prints y empezar a usar logging. Los logs son mucho mejores que los prints porque te permiten prenderlos y apagarlos según se los necesite y además permite una salida con tiempo.

El ejemplo más basico está en la documentación oficial de python:

import logging

# Esto se va a imprimir
logging.warning('Un warning es un nivel que se imprime por default') 

# Lo que sigue no se va a imprimir
logging.info('Esto imprime cuando está activado el nivel info')  

Este pequeño código imprime:

WARNING:root:Un warning es un nivel que se imprime por default

O sea que se imprime el nivel, en este caso, warning, root que por ahora no importa y luego nuestro mensaje. Pero bueno ese es el uso más básico para un script, digamos. Pero podemos ademas darle un poco más si modificamos los valores de logging por default.

import logging

# Aca modificamos la configuración básica especificando el nivel y el lugar para loguear
logging.basicConfig(filename='example.log',level=logging.DEBUG)


logging.debug('Este mensaje va al archivo')
logging.info('Este también')
logging.warning('y el warning también')

La clave aquí es basicConfig con este metodo podemos especificar un montón de cosas para nuestros logs. Por ejemplo para agregar la hora:

import logging

logging.basicConfig(format='%(asctime)s %(message)s')

logging.warning('is when this event was logged.')

Pero bueno hay muchas opciones para configurar los logs. Logging permite desde un archivo tipo logging_config.ini para configurar los logs, pasando por dict de config o seteando todo a mano para poder tener más versatilidad:

import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
        '%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)


logger.info("msj con tiempo")

# 2017-10-25 23:49:43,579 root         INFO     war

Además si tenemos una aplicación podemos interactuar con la configuración ya establecida. Pero para esas cosas les dejo un link bastante copado:  Logging — The Hitchhiker's Guide to Python

Por último ese root que aparecia al principio se puede cambiar:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info('Start reading database')
# esto imprime:
# INFO:__main__:Start reading database

Bueno en este caso usamos el __name__ para imprimir y como es un script el name es main, pero se puede poner un nomre más amigable. Otro buen link, pero también en ingles, es: good-logging-practice-in-python

 


Tags