2009-08-16 12 views
13

Si se está escribiendo una aplicación de Django/Google App Engine y me gustaría tener registros que sean convenientemente visibles en función del color (es decir, errores en rojo), ¿cómo se configura uno?¿Cómo se puede obtener el color de registro en Django/Google App Engine?

He copiado la solución útil de this question, pero no estoy seguro de cómo integrarla en Django/Google App Engine.

que pensé que uno ponga lo siguiente en main.py de la aplicación (es decir, esencialmente en el ejemplo aquí: Running Django on Google App Engine):

from contrib.utils import ColouredLogger # from the SO question above 
logging.setLoggerClass(ColouredLogger) 

... donde contrib.utils es donde pongo el código de airmind de la enlace anterior a su respuesta SO.

Sin embargo, eso no parece hacer nada en la salida de la consola para GAE, que continúa teniendo el formato original + color normal.

Sugerencias y comentarios serían muy apreciados.

Saludos, Brian

Respuesta

2

Los códigos de restablecimiento mencionados en la respuesta se ha vinculado a trabajará en una consola en el servidor de desarrollo local (pero probablemente tomará algún ajuste - que tendrá que la cadena con el vigente Controlador de registro de App Engine), pero no funcionará en producción, ya que en el registro de producción las entradas se envían a una página HTML en la consola de administración.

Sin embargo, puede filtrar por nivel de registro en la consola de administración.

+0

Gracias por contestar, Nick. Es la parte de la cadena con la que estoy teniendo problemas. :) –

2

no creo que se debe crear una subclase registrador sólo para esto - es la respuesta de airmind bien en cuanto a la creación de un organismo especializado Formatter y especificando su uso en un StreamHandler. Pero no hay necesidad de una subclase de registrador. De hecho, el uso de airmind de una clase de registrador agrega un controlador a cada registrador creado, que no es lo que desea.

La solución airmind solo dio trabajo a los terminales que admiten secuencias de escape ANSI. ¿Está seguro de que su consola los admite?

+0

Gracias Vinay. Sí, mi terminal admite colores ANSI. –

2

Aquí está una muestra de formater:

class Formatter(logging.Formatter) : 
    _level_colors = { 
     "DEBUG": "\033[22;32m", "INFO": "\033[01;34m", 
     "WARNING": "\033[22;35m", "ERROR": "\033[22;31m", 
     "CRITICAL": "\033[01;31m" 
    };  

    def format(self, record): 
     if(Formatter._level_colors.has_key(record.levelname)): 
      record.levelname = "%s%s\033[0;0m" % \ 
          (Formatter._level_colors[record.levelname], 
          record.levelname) 
     record.name = "\033[37m\033[1m%s\033[0;0m" % record.name 
     return logging.Formatter.format(self, record)  

Es necesario configurarlo, por ejemplo:

... 
[formatters] 
keys=console_formatter 
... 
[handler_console_handler] 
class=StreamHandler 
formatter=console_formatter 
args=(sys.stdout,) 
3

También quería la salida de color para el dev_appserver. He encontrado las soluciones aquí un poco exagerado (todo lo que quería era hacer mi logging.error() llamadas destaco que terminé monkeypatching el módulo de registro al dejar caer esto en mi main.py como una solución rápida:.

# monkey patch logger to dump ERRORs in red 
import os 
if os.environ['SERVER_SOFTWARE'].find('Development') >= 0: 
    import logging 
    old_error = logging.error 
    def red_error(msg,*args,**kwargs): 
     old_error("\033[22;31m%s\033[0;0m" % msg, *args, **kwargs) 
    logging.error = red_error 

Esto sólo para los terminales de color ANSI-

17

utilizamos colorlog y lo hace exactamente lo que esperas

para la posteridad, el formateador de configuración que usamos es:..

'color': { 
    '()': 'colorlog.ColoredFormatter', 
    'format': '%(log_color)s%(levelname)-8s %(message)s', 
    'log_colors': { 
     'DEBUG': 'bold_black', 
     'INFO':  'white', 
     'WARNING': 'yellow', 
     'ERROR': 'red', 
     'CRITICAL': 'bold_red', 
    }, 
} 
+0

Tenga en cuenta que el módulo [colorlog] (https://github.com/borntyping/python-colorlog) no admite [256 colores] (https://github.com/borntyping/python-colorlog/issues/7). – Sardathrion

7

Django ya es compatible con la salida de color a través de la variable de entorno 'DJANGO_COLORS', utilizada por ejemplo cuando se ejecuta el servidor de desarrollo integrado.Alguna persona se ha dado cuenta de esto y ha creado una solución plug-and-play https://github.com/tiliv/django-colors-formatter; con ese paquete en el camino pitón del proyecto mi registro settings.py es la siguiente:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'formatters': { 
     'verbose': { 
      '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output 
      'format': '%(levelname)s %(name)s %(asctime)s %(module)s %(process)d %(thread)d %(pathname)[email protected]%(lineno)s: %(message)s' 
     }, 
     'simple': { 
      '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output 
      'format': '%(levelname)s %(name)s %(filename)[email protected]%(lineno)s: %(message)s' 
     }, 
    }, 
    # omitting the handler 'level' setting so that all messages are passed and we do level filtering in 'loggers' 
    'handlers': { 
     'null': { 
      'class':'django.utils.log.NullHandler', 
     }, 
     'console':{ 
      'class':'logging.StreamHandler', 
      'formatter': 'simple', 
     }, 
     'mail_admins': { 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler', 
      'formatter': 'verbose' 
     } 
    }, 
    'loggers': { 
     '': { 
      'handlers': ['mail_admins', 'console'], 
      'level': 'WARNING', 
     }, 
    } 
} 

Ejemplo de salida de conexión de la consola usando django-colores-formateador: Sample console logging output

+3

+1 por usar la creación de mi hermano! –

+0

Instalar mediante 'pip install git + https: // github.com/tiliv/django-colors-formatter.git' – getup8

Cuestiones relacionadas