Hace algún tiempo, vi una aplicación Mono con salida en color, presumiblemente debido a su sistema de registro (porque todos los mensajes estaban estandarizados).
Ahora, Python tiene el logging
módulo, que le permite especificar muchas opciones para personalizar la salida. Entonces, imagino que algo similar sería posible con Python, pero no puedo encontrar cómo hacer esto en ningún lado.
¿Hay alguna forma de hacer que la logging
salida del módulo Python sea en color?
Lo que quiero (por ejemplo) errores en rojo, mensajes de depuración en azul o amarillo, etc.
Por supuesto, esto probablemente requeriría un terminal compatible (la mayoría de los terminales modernos lo son); pero podría recurrir a la logging
salida original si el color no es compatible.
¿Alguna idea de cómo puedo obtener resultados en color con el módulo de registro?
Respuestas:
Ya sabía sobre los escapes de color, los usé en mi solicitud de bash hace un tiempo. Gracias de cualquier manera.
Lo que quería era integrarlo con el módulo de registro, que finalmente hice después de un par de intentos y errores.
Aquí es con lo que termino:
Y para usarlo, cree su propio registrador:
Por si alguien más lo necesita.
Tenga cuidado si está utilizando más de un registrador o controlador:
ColoredFormatter
está cambiando el objeto de registro, que se pasa a otros controladores o se propaga a otros registradores. Si ha configurado los registradores de archivos, etc., probablemente no desee tener los colores en los archivos de registro. Para evitar eso, probablemente sea mejor simplemente crear una copia derecord
withcopy.copy()
antes de manipular el atributo levelname, o restablecer el nivel al valor anterior, antes de devolver la cadena formateada (crédito a Michael en los comentarios).fuente
Formatter
y especificar su uso en unStreamHandler
. Pero no hay necesidad de una subclase de registrador. De hecho, el uso de una clase de registrador agrega un controlador a cada registrador creado, que no es lo que normalmente desea.ColoredFormatter
. Está cambiando el objeto de registro, que se pasa a otros manejadores o se propaga a otros registradores. Si ha configurado los registradores de archivos, etc., probablemente no desee tener los colores en los archivos de registro. Para evitar eso, probablemente sea mejor, simplemente crear una copia derecord
withcopy.copy()
antes de manipular el atributo levelname, o restablecer el nivel al valor anterior, antes de devolver la cadena formateada.Hace años escribí un controlador de flujo de color para mi propio uso. Luego me encontré con esta página y encontré una colección de fragmentos de código que la gente está copiando / pegando :-(. Mi controlador de flujo actualmente solo funciona en UNIX (Linux, Mac OS X) pero la ventaja es que está disponible en PyPI (y GitHub ) y es muy fácil de usar. También tiene un modo de sintaxis Vim :-). En el futuro, podría extenderlo para que funcione en Windows.
Para instalar el paquete:
Para confirmar que funciona:
Para comenzar con su propio código:
El formato de registro predeterminado que se muestra en el ejemplo anterior contiene la fecha, la hora, el nombre de host, el nombre del registrador, el PID, el nivel de registro y el mensaje de registro. Así es como se ve en la práctica:
NOTA: Al usar Git Bash con MinTTY
Git Bash en Windows tiene algunas peculiaridades documentadas: Winpty y Git Bash
Para los códigos de escape ANSI y para la reescritura y animaciones de caracteres de estilo ncurses, debe prefijar los comandos con
winpty
.fuente
AttributeError: 'module' object has no attribute 'install'
cuando usocoloredlogs.install()
. ¿Puedes confirmar eso con la última versión?logging.basicConfig()
y decoloredlogs.install()
instalar un controlador de flujo que los registros a la consola, así que sin "vaciamiento" que obtendrían los mensajes duplicados ...coloredlogs.install
qué formato usar, como en elcolorlog
paquete.Aquí hay una solución que debería funcionar en cualquier plataforma. Si no me lo dice, lo actualizaré.
Cómo funciona: en la plataforma que admite escapes ANSI los está usando (no Windows) y en Windows usa llamadas API para cambiar los colores de la consola.
El script piratea el método logging.StreamHandler.emit de la biblioteca estándar agregando un contenedor.
TestColorer.py
Colorer.py
fuente
args[1].msg = color + str(args[1].msg) + '\x1b[0m' # normal
.TestColorer.py
me preocupa.Actualización : Debido a que esta es una picazón que he tenido la intención de rascar durante tanto tiempo, seguí adelante y escribí una biblioteca para personas perezosas como yo que solo quieren formas simples de hacer las cosas: zenlog
Colorlog es excelente para esto. Está disponible en PyPI (y, por lo tanto, se puede instalar
pip install colorlog
) y se mantiene activamente .Aquí hay un fragmento rápido de copiar y pegar para configurar el registro e imprimir mensajes de registro de aspecto decente:
Salida:
fuente
setLevel
realmente necesarias tres llamadas ?)Solución rápida y sucia para niveles de registro predefinidos y sin definir una nueva clase.
fuente
logging.basicConfig(format='%(asctime)s [%(name)s] [%(levelname)s] %(message)s')
donde, por supuesto,%(levelnames)s
es importante.echo -e "Normal texst \033[1;31mred bold text\033[0m normal text again"
. La-e
opción echo interpreta "\ 033" como forma octal del símbolo de escape ASCII. Este símbolo especial hace que algunos terminales compatibles interpreten los caracteres posteriores (a charm
inclusive) como comandos especiales. es.wikipedia.org/wiki/ANSI_escape_codeif sys.sdterr.isatty():
. En este caso, si redirige la salida al archivo, el archivo no contendrá estos caracteres de escape.Código 2020, no se requieren paquetes adicionales, Python 3
Define una clase
Registrador de instancias
¡Y use!
Resultado
El esquema a todo color
Para ventanas
Esta solución funciona en Mac OS, terminales IDE. Parece que el símbolo del sistema de la ventana no tiene colores por defecto. Aquí hay instrucciones sobre cómo habilitarlas, que no he probado https://www.howtogeek.com/322432/how-to-customize-your-command-prompts-color-scheme-with-microsofts-colortool/
fuente
←[38;21m2019-11-12 19:29:50,994 - My_app - DEBUG - debug message (test_colored_log.py:43)←[0m ←[38;21m2019-11-12 19:29:50,994 - My_app - INFO - info message (test_colored_log.py:44)←[0m ←[33;21m2019-11-12 19:29:50,994 - My_app - WARNING - warning message (test_colored_log.py:45)←[0m ←[31;21m2019-11-12 19:29:50,994 - My_app - ERROR - error message (test_colored_log.py:46)←[0m ←[31;1m2019-11-12 19:29:50,994 - My_app - CRITICAL - critical message (test_colored_log.py:47)←[0m
Bueno, supongo que también podría agregar mi variación del registrador de color.
Esto no es nada lujoso, pero es muy simple de usar y no cambia el objeto de registro, por lo que evita registrar las secuencias de escape ANSI en un archivo de registro si se utiliza un controlador de archivos. No afecta el formato del mensaje de registro.
Si ya está utilizando el Formateador del módulo de registro , todo lo que tiene que hacer para obtener los nombres de los niveles coloreados es reemplazar los Formateadores de sus asesores de asesoramiento con el Formateador coloreado. Si está registrando una aplicación completa, solo necesita hacer esto para el registrador de nivel superior.
coloured_log.py
Ejemplo de uso
app.py
sub_module.py
Resultados
Salida terminal
contenido de app.log
Por supuesto, puede obtener la elegancia que desee con el formato del terminal y las salidas del archivo de registro. Solo se coloreará el nivel de registro.
Espero que alguien encuentre esto útil y no sea mucho más de lo mismo. :)
Los archivos de ejemplo de Python se pueden descargar de este GitHub Gist: https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
fuente
return
:colored_record.msg = ('{0}{1}m{2}{3}').format(self.PREFIX, seq, colored_record.getMessage(), self.SUFFIX)
Actualicé el ejemplo de las etiquetas de soporte de airmind para primer plano y fondo. Simplemente use las variables de color $ BLACK - $ WHITE en su cadena de formateador de registro. Para establecer el fondo simplemente use $ BG-BLACK - $ BG-WHITE.
Así que ahora puedes hacer lo siguiente en tu archivo de configuración:
fuente
super
supongo que el comentario solo se aplica a alguna versión antigua de Python. Dado que esta respuesta es de 2010. Funcionó bien para mí con Python 2.7Puede importar el módulo de registro de colores y usarlo
ColoredFormatter
para colorear los mensajes de registro.Ejemplo
Placa para el módulo principal:
El código solo permite colores en los mensajes de registro, si el módulo de registro de colores está instalado y si la salida realmente va a un terminal. Esto evita que las secuencias de escape se escriban en un archivo cuando se redirige la salida del registro.
Además, se configura un esquema de color personalizado que es más adecuado para terminales con fondo oscuro.
Algunos ejemplos de llamadas de registro:
Salida:
fuente
colorlog.basicConfig
lugar delogging.basicConfig
que tiene algunos valores predeterminados buenosMira la siguiente solución. El controlador de flujo debe ser lo que hace la coloración, entonces tiene la opción de colorear palabras en lugar de solo la línea completa (con el Formateador).
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
fuente
Modifiqué el ejemplo original proporcionado por Sorin y subclase StreamHandler a ColorizedConsoleHandler.
La desventaja de su solución es que modifica el mensaje, y debido a que está modificando el mensaje de registro real, cualquier otro controlador también recibirá el mensaje modificado.
Esto resultó en archivos de registro con códigos de color en nuestro caso porque usamos múltiples registradores.
La siguiente clase solo funciona en plataformas que admiten ansi, pero debería ser trivial agregarle los códigos de color de Windows.
fuente
Ahora hay un módulo PyPi lanzado para salida de registro de color personalizable:
https://pypi.python.org/pypi/rainbow_logging_handler/
y
https://github.com/laysakura/rainbow_logging_handler
Soporta Windows
Soporta Django
Colores personalizables
Como se distribuye como un huevo de Python, es muy fácil de instalar para cualquier aplicación de Python.
fuente
Hay toneladas de respuestas. Pero ninguno habla de decoradores. Así que aquí está el mío.
Porque es mucho más simple.
No es necesario importar nada, ni escribir ninguna subclase:
Esto establece los errores en rojo, los mensajes de depuración en azul, etc. Como se hizo en la pregunta.
Incluso podríamos adaptar el contenedor para tomar un
color
argumento para establecer dinámicamente el color del mensaje usandologger.debug("message", color=GREY)
EDITAR: Así que aquí está el decorador adaptado para establecer colores en tiempo de ejecución:
fuente
Otro remix menor del enfoque de airmind que mantiene todo en una clase:
Para usar adjuntar el formateador a un controlador, algo como:
fuente
Una herramienta simple pero muy flexible para colorear CUALQUIER texto de terminal es ' colout '.
Donde cualquier texto en la salida de 'myprocess' que coincida con el grupo 1 de la expresión regular se coloreará con color1, grupo 2 con color2, etc.
Por ejemplo:
es decir, el primer grupo de expresiones regulares (parens) coincide con la fecha inicial en el archivo de registro, el segundo grupo coincide con un nombre de archivo de Python, número de línea y nombre de función, y el tercer grupo coincide con el mensaje de registro que viene después de eso. También uso una secuencia paralela de 'negrita / normal', así como la secuencia de colores. Esto se ve así:
Tenga en cuenta que las líneas o partes de líneas que no coinciden con ninguna de mis expresiones regulares todavía tienen eco, por lo que esto no es como 'grep --color': nada se filtra de la salida.
Obviamente, esto es lo suficientemente flexible como para que pueda usarlo con cualquier proceso, no solo siguiendo archivos de registro. Por lo general, solo preparo una nueva expresión regular sobre la marcha cada vez que quiero colorear algo. Por esta razón, prefiero colout a cualquier herramienta personalizada para colorear archivos de registro, porque solo necesito aprender una herramienta, independientemente de lo que esté coloreando: registro, salida de prueba, fragmentos de código de resaltado de sintaxis en el terminal, etc.
También evita realmente descargar códigos ANSI en el archivo de registro en sí, lo que en mi humilde opinión es una mala idea, porque romperá cosas como buscar patrones en el archivo de registro a menos que siempre recuerde hacer coincidir los códigos ANSI en su expresión regular grep.
fuente
fuente
[9*m
códigos para los colores ANSI "brillantes"! PD: su última línea me preocupa un poco porque aún no se sabe si iniciar sesión fuera de una definición de función es seguro en Python .Aquí está mi solución:
fuente
La parte con la que tuve problemas fue configurar el formateador correctamente:
Y luego usar:
fuente
Si bien las otras soluciones parecen estar bien, tienen algunos problemas. Algunos colorean las líneas enteras que algunas veces no se desean y otros omiten cualquier configuración que puedan tener todos juntos. La solución a continuación no afecta nada más que el mensaje en sí.
Código
Ejemplo
Salida
Como puede ver, todo lo demás aún se genera y permanece en su color inicial. Si desea cambiar algo más que el mensaje, simplemente puede pasar los códigos de color a
log_format
en el ejemplo.fuente
[17:01:36]:WARNING:this should be yellowthis should be yellow
una línea completa que se imprime dos veces?7s:%(message)s
archivolog_format
.Tengo dos presentaciones para agregar, una de las cuales colorea solo el mensaje (ColoredFormatter), y una que colorea toda la línea (ColorizingStreamHandler). Estos también incluyen más códigos de color ANSI que las soluciones anteriores.
Parte del contenido se ha obtenido (con modificación) de: La publicación anterior y http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
Colorea solo el mensaje:
Colorea toda la línea:
fuente
Acabo de responder lo mismo en una pregunta similar: Python | cambiar el color del texto en el shell
La idea es usar la biblioteca de clint . Que tiene soporte para shells MAC, Linux y Windows (CLI).
fuente
Esta es una enumeración que contiene los códigos de color:
Esto puede aplicarse a los nombres de cada nivel de registro. Ten en cuenta que este es un truco monstruoso.
Tenga en cuenta que su formateador de registro debe incluir el nombre del nivel de registro
por ejemplo:
fuente
FriendlyLog es otra alternativa. Funciona con Python 2 y 3 en Linux, Windows y MacOS.
fuente
¿Qué pasa con resaltar también los argumentos del mensaje de registro con colores alternos, además de colorear por nivel? Recientemente escribí un código simple para eso. Otra ventaja es que la llamada de registro se realiza con el formato de estilo de llave de Python 3. (
"{}"
)Vea el último código y ejemplos aquí: https://github.com/davidohana/colargulog
Código de registro de muestra:
Salida:
Implementación:
fuente
Utiliza pyfancy .
Ejemplo:
fuente
logging
funcionalidad para usar una biblioteca de colores separada.Solo otra solución, con los colores de ZetaSyanthis:
llámalo una vez desde tu
__main__
función. Tengo algo como esto allí:También verifica que la salida es una consola, de lo contrario no se utilizan colores.
fuente
Uso
Logger("File Name").info("This shows green text")
fuente
La siguiente solución solo funciona con Python 3, pero para mí parece más clara.
La idea es usar la fábrica de registros de registro para agregar atributos 'coloreados' a los objetos de registro de registros y luego usar estos atributos 'coloreados' en formato de registro.
Puede modificar fácilmente este ejemplo para crear otros atributos coloreados (fe message_c) y luego usar estos atributos para obtener texto coloreado (solo) donde desee.
(Truco práctico que descubrí recientemente: tengo un archivo con registros de depuración de colores y cada vez que quiero aumentar temporalmente el nivel de registro de mi aplicación, solo
tail -f
el archivo de registro en un terminal diferente y veo registros de depuración en la pantalla sin cambiar ninguna configuración y reiniciar la aplicación )fuente
Esta es otra variante de Python3 del ejemplo de airmind. Quería algunas características específicas que no vi en los otros ejemplos
Notas: Utilicé colorama pero puedes modificar esto para que no sea obligatorio. También para mi prueba, solo estaba ejecutando el archivo python, por lo que mi clase está en el módulo
__main__
. Tendría que cambiar(): __main__.ColoredFormatter
a cualquiera que sea su módulo.logging.yaml
main.py
salida:
fuente