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 stdout. ¿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 un poco de ayuda aquí!
StreamHandler
consys.stdout
, y luego se registrará en eso en lugar de stderr.import sys
primero. Y en realidad inicializar el controlador, es decirconsoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
si estás intentando ver información o mensajes de depuraciónlogging.basicConfig()
puede tomar un argumento de palabra clavehandlers
desde Python 3.3, lo que simplifica mucho la configuración de registro, especialmente cuando se configuran múltiples controladores con el mismo formateador:Por lo tanto, toda la configuración se puede hacer con una sola llamada como esta:
(O con los requisitos de
import sys
+StreamHandler(sys.stdout)
según la pregunta original: el valor predeterminado para StreamHandler es escribir en stderr. Mire los atributos de LogRecord si desea personalizar el formato de registro y agregar elementos como nombre de archivo / línea, información de hilo, etc.)La configuración anterior solo debe realizarse una vez cerca del comienzo del script. Puede usar el registro desde todos los otros lugares en la base de código más adelante de esta manera:
Nota: Si no funciona, es probable que otra persona ya haya inicializado el sistema de registro de manera diferente. Los comentarios sugieren hacer
logging.root.handlers = []
antes de la llamada abasicConfig()
.fuente
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Esto significa que cuando solo desea iniciar sesión en la misma carpeta, simplemente puede usarFileHandler("mylog.log")
. Si desea sobrescribir el registro cada vez, establezca "w" como segundo argumento.logging.root.handlers = []
antes de la llamada abasicConfig
, eche un vistazo a la función: es molesto.Agregar un StreamHandler sin argumentos va a stderr en lugar de stdout. Si algún otro proceso depende del volcado stdout (es decir, al escribir un complemento NRPE), asegúrese de especificar stdout explícitamente o podría encontrarse con algunos problemas inesperados.
Aquí hay un ejemplo rápido que reutiliza los valores asumidos y el LOGFILE de la pregunta:
fuente
Ya sea correr
basicConfig
constream=sys.stdout
como argumento antes de establecer cualquier otro manipuladores o ingresar cualquier mensaje, o manualmente añadirStreamHandler
que los mensajes empuja a la salida estándar al registrador de la raíz (o cualquier otro registro prefieres, para el caso).fuente
Después de haber usado el código de Waterboy una y otra vez en múltiples paquetes de Python, finalmente lo convertí en un pequeño paquete de Python independiente, que puedes encontrar aquí:
https://github.com/acschaefer/duallog
El código está bien documentado y es fácil de usar. Simplemente descargue el
.py
archivo e inclúyalo en su proyecto, o instale todo el paquete a través depip install duallog
.fuente
Inicio de sesión en
stdout
yrotating file
con diferentes niveles y formatos:fuente
Aquí hay una solución completa y bien envuelta basada en la respuesta de Waterboy y varias otras fuentes. Admite el registro tanto en la consola como en el archivo de registro, permite diferentes configuraciones de nivel de registro, proporciona resultados coloreados y es fácilmente configurable (también disponible como Gist ):
fuente
Para 2.7, intente lo siguiente:
fuente