Algoritmos de Programación con Python

11.5. Agregar información a un archivo

Abrir un archivo en modo agregar al final puede parece raro, pero es bastante útil.

Uno de sus usos es para escribir un archivo de bitácora (o archivo de log), que nos permita ver los distintos eventos que se fueron sucediendo, y así encontrar la secuencia de pasos (no siempre evidente) que hace nuestro programa.

Esta es una forma muy habitual de buscar problemas o hacer un seguimiento de los sucesos. Para los administradores de sistemas es una herramienta esencial de trabajo.

En el Código 11.4 se muestra un módulo para manejo de logs, que se encarga de la apertura del archivo, del guardado de las líneas una por una y del cerrado final del archivo.

En este módulo se utiliza el módulo de Python datetime para obtener la fecha y hora actual que se guardará en los archivos. Es importante notar que en el módulo mostrado no se abre o cierra un archivo en particular, sino que las funciones están programadas de modo tal que puedan ser utilizadas desde otro programa.

Se trata de un módulo genérico que podrá ser utilizado por diversos programas, que requieran la funcionalidad de registrar los posibles errores o eventos que se produzcan durante la ejecución.

Para utilizar este módulo, será necesario primero llamar a abrir_log para abrir el archivo de log, luego llamar a guardar_log por cada mensaje que se quiera registrar, y finalmente llamar a cerrar_log cuando se quiera concluir la registración de mensajes.

Por ejemplo, en el Código 11.5 se muestra un posible programa que utiliza el módulo de log incluido anteriormente.

# Código 11.4: log.py: Módulo para manipulación de archivos de log
#! /usr/bin/env python
# encoding: latin1

# El módulo datetime se utiliza para obtener la fecha y hora actual.
import datetime

def abrir_log(nombre_log):
    """ Abre el archivo de log indicado. Devuelve el archivo abierto.
    Pre: el nombre corresponde a un nombre de archivo válido.
    Post: el archivo ha sido abierto posicionándose al final. """
    archivo_log = open(nombre_log, "a")
    guardar_log(archivo_log, "Iniciando registro de errores")
    return archivo_log

def guardar_log(archivo_log, mensaje):
    """ Guarda el mensaje en el archivo de log, con la hora actual.
    Pre: el archivo de log ha sido abierto correctamente.
    Post: el mensaje ha sido escrito al final del archivo. """
    # Obtiene la hora actual en formato de texto
    hora_actual = str(datetime.datetime.now())
    # Guarda la hora actual y el mensaje de error en el archivo
    archivo_log.write(hora_actual+" "+mensaje+"\\n")

def cerrar_log(archivo_log):
    """ Cierra el archivo de log.
    Pre: el archivo de log ha sido abierto correctamente.
    Post: el archivo de log se ha cerrado. """
    guardar_log(archivo_log, "Fin del registro de errores")
    archivo_log.close()
# Código 11.5: usa_log.py: Módulo que utiliza el módulo de log
#!/usr/bin/env python
#encoding latin1

import log

# Constante que contiene el nombre del archivo de log a utilizar
ARCHIVO_LOG = "mi_log.txt"

def main():
    # Al comenzar, abrir el log
    archivo_log = log.abrir_log(ARCHIVO_LOG)
    # ...
    # Hacer cosas que pueden dar error
    if error:
        guardar_log(archivo_log, "ERROR: "+error)
    # ...
    # Finalmente cerrar el archivo
    log.cerrar_log(archivo_log)

main()

Este código, que incluye el módulo log mostrado anteriormente, muestra una forma básica de utilizar un archivo de log. Al iniciarse el programa se abre el archivo de log, de forma que queda registrada la fecha y hora de inicio. Posteriormente se realizan tareas varias que podrían provocar errores, y de haber algún error se lo guarda en el archivo de log. Finalmente, al terminar el programa, se cierra el archivo de log, quedando registrada la fecha y hora de finalización.

El archivo de log generado tendrá la forma:

2015-04-10 15:20:32.229556 Iniciando registro de errores
2015-04-10 15:20:50.721415 ERROR: no se pudo acceder al recurso
2015-04-10 15:21:58.625432 ERROR: formato de entrada inválido
2015-04-10 15:22:10.109376 Fin del registro de errores

Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano, Nicolás Paez. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.