Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

Generación de registros de sistema


Cita con formato IEEE:
E. Bahit, "Generación de registros de sistema", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 118-123.

Cita con formato APA 7:
Bahit, E. (2022). Generación de registros de sistema. In Python Aplicado (4th ed., pp. 128-123). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

Si se necesita que un programa o script del sistema guarde un registro, puede emplearse el módulo logging. Este módulo provee cinco niveles de registros, los cuales se describen en la siguiente tabla.

Niveles de registro del módulo logging
NIVEL Utilizado generalmente cuando se desea...
DEBUG 10 monitorizar el funcionamiento de un programa
permitiendo depurar un programa durante su ejecución normal, a fin de obtener la información deseada para efectuar un diagnóstico determinado.
INFO 20 registrar eventos afirmativos
es decir, mantener un registro detallado, de ciertas acciones ejecutadas en la aplicación, de forma satisfactoria.
WARNING 30 emitir una alerta sobre un evento determinado
permitiendo grabar en el archivo de registros, información que, sin representar un error o momento crítico de fallo, podría ser indicativa de un posible fallo, error, o acción no deseada. Generalmente útil en advertencias de seguridad.
ERROR 40 registrar un error
cuando el programa no logra llevar a cabo una acción esperada
CRITICAL 50 registrar un error que frene la ejecución normal del programa.
Suele emplearse cuando errores fatales son capturados, y la ejecución normal del programa se ve impedida.

El nivel por defecto es WARNING, por lo que si se desea grabar (o mostrar) registros de niveles inferiores como o , deberá modificarse el nivel de registro por defecto.

Los registros pueden mostrarse en pantalla o grabarse en un archivo, tal y como se hará en lo sucesivo.

Principales elementos del módulo logging

Constantes: representan los distintos niveles de registro. Estas son:

INFO, DEBUG, WARNING, ERROR, CRITICAL

Clase basicConfig: utilizada para inicializar un registro, configurar el nivel de registro por defecto, y opcionalmente, establecer la ruta del archivo de registro y el modo de escritura.

from logging import basicConfig, INFO
basicConfig(
  filename='/var/log/programa.log', 
  filemode='a', 
  level=INFO
)

Los parámetros compartidos en ambas ramas del lenguaje, para con los siguientes:

Algunas de las admitidas como parte del valor del parámetro , son las siguientes:

    asctime           %(asctime)s
    created           %(created)f
    filename          %(filename)s
    funcName          %(funcName)s
    levelname         %(levelname)s
    levelno           %(levelno)s
    lineno            %(lineno)d
    module            %(module)s
    msecs             %(msecs)d
    message           %(message)s
    name              %(name)s
    pathname          %(pathname)s
    process           %(process)d
    processName       %(processName)s
    relativeCreated   %(relativeCreated)d
    thread            %(thread)d
    threadName        %(threadName)s

Para una descripción detallada, ver la sección «LogRecord Attributes» en la documentación oficial de Python6.

Ambas ramas conservan las mismas variables.

'[%(asctime)s] [%(levelname)s] [pid %(process)d] MYAPP MyErrorLevel Alert: %(message)s'

El ejemplo anterior, producirá un registro similar al siguiente:

[2018-04-20 00:34:42,803] [WARNING] [pid 12318] MYAPP MyErrorLevel Alert: Posible violación de seguridad

Para establecer el formato que tendrá la fecha, mediante el parámetro datefmt se pueden emplear las directivas descritas en la siguiente tabla:

Directivas de formato para registro de fechas en el módulo logging de Python
DIRECTIVA SIGNIFICADO DIRECTIVA SIGNIFICADO
%A Nombre del día de la semana %M Minutos [00,59].
%b Abreviatura del nombre del mes %p AM / PM.
%B Nombre del mes completo %S Segundos [00,59].
%d Número del día del mes [01,31] %w Número del día de la semana [0,6]
%H Hora en formato de 24 horas [00,23] %y Año en formato YY [00,99]
%I Hora en formato de 12 horas [00,12] %Y Año
%m Número del mes [01,12]. %Z Zona horaria
Fuente: https://docs.python.org/3.6/library/time.html#time.strftime

Funciones de registro: utilizadas para mostrar o grabar los diferentes mensajes de registro. Estas son:

info(), debug(), warning(), error(), critical()

A estas funciones, se le debe pasar como parámetro, el mensaje que se desea almacenar en el registro:

funcion("mensaje a grabar")

También es posible emplear variables como parte del mensaje, utilizando modificadores formato en la cadena, y pasando las variables como argumentos:

funcion("Mensaje %s %i", variable_string, variable_entero)

Replicando el siguiente código y ejecutándolo repetidas veces con modificaciones, tanto de configuración, como de niveles de registro y mensajes, permitirá un mejor entendimiento de la biblioteca y sus posibilidades de implementación.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from logging import basicConfig, error, info, INFO
from sys import argv

basicConfig(
    filename='ejemplo_logging.log', 
    filemode='a', 
    level=INFO,
    format='[%(asctime)s] [%(levelname)s] [pid %(process)d] %(message)s',
    datefmt="%d/%m/%Y %H:%M"
)

try:
    with open(argv[1], "a") as f:
        f.write(argv[2])

    info("Agregado el texto %s al archivo %s", argv[2], argv[1])
except:
    error("Se produjo un error al escribir en el archivo %s", argv[1])

try:
    with open("/var/log/foo.log", "a") as f:
        f.write("Mensaje de prueba")
except Exception as problema:
    error(problema)

argv es una lista del módulo system, que almacena los argumentos pasados al script por línea de comandos, siendo la ruta del archivo o nombre del ejecutable, el primer elemento de la lista.