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.
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:
- filename: ruta del archivo
- filemode: modo de apertura (comúnmente
'a'
[append, valor por defecto] o'w'
[escritura]) - format: establece el formato en el que se generarán los registros
- datefmt: formato de fecha y hora que se utilizará en los registros
- level: nivel de registro (cualquiera de las 5 constantes)
- stream (esta opción no será abarcada en el curso)
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:
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.