es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo implementar un registrador implícito en Python?

Quiero agregar un registro útil a una base de código de Python.

Estoy buscando agregar registros de la siguiente forma:

[2022-01-06 10:00:01] función foo llamada con argumentos x=1, y=22, z=3
[2022-01-06 10:00:05] función foo retornó 1416
[2022-01-06 10:00:13] función bar llamada con argumentos w=1416
[2022-01-06 10:00:16] función bar retornó None

Podría hacer esto envolviendo todas las funciones en la base de código con un decorador, pero ¿existe una manera mejor? Al menos para indicar la marca de tiempo y el orden en que se están llamando las funciones.

Podría implementar el decorador:

def logthis(func):
    def inner(<em>args, *</em>kwargs):
        logger.info(f'Llamando a {func.__name__} con argumentos={args} y kwargs={kwargs}')
        ans = func(<em>args, *</em>kwargs)
        logger.info(f'La función {func.__name__} retornó {ans}')
        return ans
    return inner

@logthis
def foo(x, y, z):
   return x+y+z

@logthis
def bar(w):
   return None

Esto funciona bastante bien, siempre y cuando esté dispuesto a agregarlo en toda mi base de código.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sin embargo, hay una forma más eficiente de lograr esto. Python proporciona un módulo de registro incorporado que se puede usar para registrar todo tipo de información, como mensajes, excepciones, advertencias y errores. Podemos utilizar este módulo para registrar la marca de tiempo, el nombre de la función y los argumentos de una manera más estandarizada en todo el código. Podemos establecer el nivel de registro, el formato y la ubicación de salida según nuestras necesidades.

    Para comenzar, necesitamos importar el módulo de registro y crear un objeto de registro:

    import logging
    
    logging.basicConfig(filename='example.log', level=logging.INFO, format='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    logger = logging.getLogger(__name__)
    

    Aquí, establecemos el nivel de registro en INFO, lo que significa que se registrarán todos los mensajes con nivel INFO y superior (por ejemplo, WARNING, ERROR, CRITICAL). Especificamos el nombre del archivo de registro, el formato y el formato de fecha. Creamos un objeto de registro para el módulo actual utilizando __name__.

    Ahora, podemos definir nuestras funciones y agregar declaraciones de registro donde sea necesario:

    def foo(x, y, z):
       logger.info(f'función foo llamada con argumentos x={x}, y={y}, z={z}')
       ans = x + y + z
       logger.info(f'función foo devolvió {ans}')
       return ans
    
    def bar(w):
       logger.info(f'función bar llamada con argumento w={w}')
       return None
    

    De esta manera, podemos registrar el nombre de la función, la marca de tiempo y los argumentos para cada llamada a la función sin necesidad de un decorador. También podemos personalizar aún más los mensajes y formatos de registro según nuestros requisitos específicos. Además, el registro de esta manera facilita la filtración y búsqueda de registros mediante herramientas estándar.

Comments are closed.