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

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í!

Simplemente obtenga un identificador para el registrador raíz y agregue el 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 controladores que 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.

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 podría tener 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) 

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) .

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 pip install duallog en su proyecto, o instale el paquete completo a través de pip install duallog .

Para 2.7, intente lo siguiente:

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