Skip to content

Logging

Logging

Con el módulo logging, podemos registrar los mensajes que deseamos ver. Existen cinco (5) niveles estándar que indican la gravedad o el tipo de evento.

•   DEBUG - Depuración
•   INFO - Información
•   WARNING - Advertencia
•   ERROR - Error
•   CRITICAL – Crítico

El módulo logging proporciona un registrador predeterminado que nos permite comenzar sin necesidad de hacer mucha configuración. Los métodos correspondientes para cada nivel se pueden llamar de la siguiente manera:

import logging
import logging

logging.debug('Este es un mensaje de depuración')
logging.info('Este es un mensaje de información')
logging.warning('Este es un mensaje de advertencia')
logging.error('Este es un mensaje de error')
logging.critical('Este es un mensaje Critico')
WARNING:root:Este es un mensaje de advertencia
ERROR:root:Este es un mensaje de error
CRITICAL:root:Este es un mensaje Critico

Observamos, que los mensajes debug() e info() no se muestran. Esto es porque de forma predeterminada, el módulo logging registra los mensajes con un nivel de gravedad de ADVERTENCIA o superior.

Configuraciones básicas (Basic Configurations) Podemos utilizar el método basicConfig(**kwargs) para configurar logging. Algunos de los parámetros más utilizados para basicConfig() son los siguientes:

•   level o nivel: La raíz de logging se establecerá en el nivel de gravedad especificado.
•   filename o nombre de archivo: especifica el archivo.

Mediante el parámetro level, puede establecer el nivel de mensajes de registro que desea registrar. Esto se puede hacer pasando una de las constantes disponibles en la clase, y esto permitiría que se registren todas las llamadas de registro en o por encima de ese nivel. Por ejemplo:

logging.basicConfig(level=logging.DEBUG)

Todos los eventos por encima o en el mismo nivel DEBUG, ahora se registrarán. Si necesitamos guardar estos registros en un archivo en lugar de mostrarlos en la consola, podemos utilizar el nombre de archivo y el modo de archivo y decidir el formato del mensaje utilizando el formato

# Para visualizar la creación del fichero, abrir ficheros logging.py en Pycharm

import logging
import os

logFormatter = '%(asctime)s - %(user)s - %(levelname)s - %(message)s'

logging.basicConfig(level=logging.DEBUG, filename="milog.log", filemode='a',  format= logFormatter, datefmt='%d-%b-%y %H:%M:%S')
logger = logging.getLogger()  # crear el objeto

logger.warning('Estos se registrará en el archivo milog.log')
logger.info('El administrador, ha iniciado sesisón')
logger.warning('El administrador, ha cerrado su sesisón')
logger.debug('Esto es un ejemplo...')
logger.error('Este es un mensaje de error')
logger.critical('Este es un mensaje Critico')
WARNING:root:Estos se registrará en el archivo milog.log
INFO:root:El administrador, ha iniciado sesisón
WARNING:root:El administrador, ha cerrado su sesisón
DEBUG:root:Esto es un ejemplo...
ERROR:root:Este es un mensaje de error
CRITICAL:root:Este es un mensaje Critico

Formatear fichero de log

import logging

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('Este es una advertencia ....')
WARNING:root:Este es una advertencia ....
import logging

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S', level=logging.INFO)
logging.info('El administrador, ha iniciado sesisón')
INFO:root:El administrador, ha iniciado sesisón
import logging

logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('El administrador, ha cerrado su sesión')
WARNING:root:El administrador, ha cerrado su sesión

Se pueden pasar variables al log

import logging

name = 'John'
logging.error(f'{name} generó un error')
ERROR:root:John generó un error

Enviar excepciones al log

import logging

a = 5
b = 0

try:
  c = a / b
except Exception as e:
    logging.error("Ha ocurrido una excepción", exc_info=True)
ERROR:root:Ha ocurrido una excepción
Traceback (most recent call last):
  File "<ipython-input-9-87a667ac2f71>", line 7, in <module>
    c = a / b
ZeroDivisionError: division by zero

El método addHandler() asigna el handler correspondiente al logger.

El método addHandler() no tiene ninguna cuota mínima o máxima para el número de controladores que puede agregar. A veces será beneficioso para una aplicación registrar todos los mensajes de todas las gravedades en un archivo de texto mientras registra simultáneamente errores o arriba en la consola.

import logging

logger = logging.getLogger('Ejemplo de LOG')

# Todos los mensajes de niveles superiores a DEBUG se guardan en el fichero
fh = logging.FileHandler('debug_jup.log') # Archivo 
fh.setLevel(logging.DEBUG)

# Todos los mensajes de ERROR o CRITICAL se mostrarán en la consola
ch = logging.StreamHandler()  # Consola
ch.setLevel(logging.ERROR)

#formato de los mensajes
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# Creamos los objetos
logger.addHandler(fh)
logger.addHandler(ch)

# Código de nuestra aplicación
logger.debug('mensaje debug')
logger.info('mensaje info')
logger.warning('mensaje warning')
logger.error('mensaje error')
logger.critical('mensaje critical')
DEBUG:Ejemplo de LOG:mensaje debug
INFO:Ejemplo de LOG:mensaje info
WARNING:Ejemplo de LOG:mensaje warning
2021-09-13 20:52:03,580 - Ejemplo de LOG - ERROR - mensaje error
ERROR:Ejemplo de LOG:mensaje error
2021-09-13 20:52:03,581 - Ejemplo de LOG - CRITICAL - mensaje critical
CRITICAL:Ejemplo de LOG:mensaje critical