Pregunta

Quiero unificar toda la instalación de registro de mi aplicación. Cualquier advertencia es una excepción, luego la atrapo y se la paso al registrador. Pero la pregunta: ¿hay en el registro alguna instalación de silencio? A veces el registrador se vuelve demasiado detallado. A veces, debido a advertencias demasiado ruidosas, ¿hay algún límite detallado en las advertencias?

http://docs.python.org/library/logging.html

http://docs.python.org/library/warnings.html

¿Fue útil?

Solución

No solo hay niveles de registro , sino que hay un forma realmente flexible de configurarlos . Si está utilizando objetos con nombre logger (p. Ej., logger = logging.getLogger (...) ), puede configurarlos adecuadamente. Eso le permitirá configurar la verbosidad en un subsistema por subsistema donde un subsistema se define por la jerarquía de registro.

La otra opción es usar logging.Filter y Filtros de advertencia para limitar la salida . No he usado este método antes, pero parece que podría ajustarse mejor a tus necesidades.

Dele a PEP-282 una lectura para una buena descripción en prosa de el paquete Python logging . Creo que describe la funcionalidad mucho mejor que la documentación del módulo.

Editar después de la aclaración

Es posible que pueda manejar la parte de registro de esto utilizando una clase personalizada basada en logging.Logger y registrada con logging.setLoggerClass () . Realmente parece que quieres algo similar al " Último mensaje de syslog repetido 9 veces " . Desafortunadamente no sé de una implementación de esto en ningún lado. Es posible que desee ver si twisted.python.log admite esta funcionalidad.

Otros consejos

de la fuente que mencionaste. están los niveles de registro, use el sabiamente ;-)

LEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}

Esto será un problema si planea hacer todas las llamadas de registro desde un controlador de error ciego que no sabe nada sobre el código que generó el error, que es como suena su pregunta. ¿Cómo va a decidir qué llamadas de registro se realizan y cuáles no?

La práctica más estándar es usar dichos bloques para recuperar si es posible, y registrar un error (realmente, si es un error para el que no estaba preparado específicamente, desea saberlo; use un nivel alto) . Pero no confíe en estos bloques para toda su información de estado / depuración. Es mejor rociar su código con llamadas de registro antes de que llegue al controlador de errores. De esa manera, puede observar información útil en tiempo de ejecución sobre un sistema cuando NO está fallando y puede realizar llamadas de registro de diferente gravedad. Por ejemplo:

import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger.  Change this for better organization
# Add your appenders or what have you
def handle_error(e):
    logger.error("Unexpected error found")
    logger.warn(format_exc()) #put the traceback in the log at lower level
    ... #Your recovery code
def do_stuff():
    logger.info("Program started")
    ... #Your main code
    logger.info("Stuff done")
if __name__ == "__main__":
    try:
        do_stuff()
    except Exception,e:
        handle_error(e)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top