ylab color categoryorder python file logging stdout

python - color - plotly layout



configuración del registrador para registrar en el archivo e imprimir en la salida estándar (6)

Estoy usando el módulo de registro de Python para registrar algunas cadenas de depuración en un archivo que funciona bastante bien. Ahora, además, me gustaría usar este módulo para imprimir también las cadenas en la salida estándar. ¿Cómo hago esto? Para registrar mis cadenas en un archivo, uso el siguiente código:

import logging import logging.handlers logger = logging.getLogger("") logger.setLevel(logging.DEBUG) handler = logging.handlers.RotatingFileHandler( LOGFILE, maxBytes=(1048576*5), backupCount=7 ) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) logger.addHandler(handler)

y luego llamar a una función de registrador como

logger.debug("I am written to the file")

¡Gracias por alguna ayuda aquí!


Agregar un StreamHandler sin argumentos va a stderr en lugar de stdout. Si algún otro proceso tiene una dependencia en el volcado de la salida estándar (es decir, al escribir un complemento NRPE), asegúrese de especificar explícitamente la salida estándar o puede que tenga algunos problemas inesperados.

Aquí hay un ejemplo rápido que reutiliza los valores asumidos y LOGFILE de la pregunta:

import logging from logging.handlers import RotatingFileHandler from logging import handlers import sys log = logging.getLogger('''') log.setLevel(logging.DEBUG) format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch = logging.StreamHandler(sys.stdout) ch.setFormatter(format) log.addHandler(ch) fh = handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7) fh.setFormatter(format) log.addHandler(fh)


Después de haber usado el código de Waterboy una y otra vez en varios paquetes de Python, finalmente lo convertí en un pequeño paquete independiente de Python, que puede encontrar aquí:

https://github.com/acschaefer/duallog

El código está bien documentado y es fácil de usar. Simplemente descargue el archivo .py e python setup.py install en su proyecto, o instale el paquete completo a través de la instalación de python setup.py install .


Ejecute basicConfig con stream=sys.stdout como el argumento antes de configurar cualquier otro controlador o registro de mensajes, o agregue manualmente un StreamHandler que empuja los mensajes a stdout al registrador raíz (o cualquier otro registrador que desee, para el caso) .


Para 2.7, intente lo siguiente:

fh = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7)


Simplemente obtenga un identificador para el registrador raíz y agregue StreamHandler. El StreamHandler escribe a stderr. No estoy seguro si realmente necesita stdout sobre stderr, pero esto es lo que uso cuando configuro el registrador Python y también agrego el FileHandler también. Luego todos mis registros van a ambos lugares (que es lo que parece que quieres).

import logging logging.getLogger().addHandler(logging.StreamHandler())

También puede agregarle un formateador para que todas sus líneas de registro tengan un encabezado común.

es decir:

import logging logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s") rootLogger = logging.getLogger() fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName)) fileHandler.setFormatter(logFormatter) rootLogger.addHandler(fileHandler) consoleHandler = logging.StreamHandler() consoleHandler.setFormatter(logFormatter) rootLogger.addHandler(consoleHandler)

Imprime en el formato de:

2012-12-05 16:58:26,618 [MainThread ] [INFO ] my message


logging.basicConfig() puede tomar handlers argumentos de palabras clave desde Python 3.3, lo que simplifica mucho la configuración del registro, especialmente cuando se configuran varios controladores con el mismo formateador:

handlers : si se especifican, este debería ser un iterable de los manejadores ya creados para agregar al registrador raíz. A los manejadores que aún no tengan un conjunto de formateadores se les asignará el formateador predeterminado creado en esta función.

El código de ejemplo bastante largo y detallado de la respuesta aceptada, por lo tanto, se convierte en esto:

import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s", handlers=[ logging.FileHandler("{0}/{1}.log".format(logPath, fileName)), logging.StreamHandler() ])

(O con import sys + StreamHandler(sys.stdout) según los requisitos de la pregunta original).

Para obtener el registrador, use

logger = logging.getLogger()

Más adelante en su script, use logger.info() para generar mensajes de registro útiles.