如何在 Django/Google App Engine 中制作日志颜色?

Posted

技术标签:

【中文标题】如何在 Django/Google App Engine 中制作日志颜色?【英文标题】:How does one make logging color in Django/Google App Engine? 【发布时间】:2010-11-20 02:23:25 【问题描述】:

如果一个人正在编写一个 Django/Google App Engine 应用程序,并且希望拥有基于颜色(即红色错误)方便显眼的日志,那么如何设置呢?

我从this question 复制了有用的解决方案,但我不确定如何将它集成到 Django/Google App Engine 中。

我认为可以将以下内容放在应用程序的 main.py 中(即基本上来自此处的示例:Running Django on Google App Engine):

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

... contrib.utils 是我将上面链接中的 airmind 代码放到他的 SO 答案的地方。

但是,这似乎对 GAE 控制台的输出没有任何作用,它仍然是原始格式 + 纯色。

非常感谢您提出建议和意见。

干杯, 布赖恩

【问题讨论】:

【参考方案1】:

我们使用colorlog,它完全符合您的期望。

为了后代,我们使用的格式化程序配置是:

'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',
    ,

【讨论】:

注意colorlog模块不支持256 colours。 关于日志记录的官方文档的链接也会有所帮助。 docs.djangoproject.com/en/dev/topics/logging/#examples【参考方案2】:

Django 已经支持通过“DJANGO_COLORS”环境变量输出颜色,例如在运行内置开发服务器时使用。有人注意到了这一点并创建了一个即插即用的解决方案https://github.com/tiliv/django-colors-formatter;在项目的 python 路径中使用该包,我的日志记录 settings.py 如下:

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)s@%(lineno)s: %(message)s'
        ,
        'simple': 
            '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output
            'format': '%(levelname)s %(name)s %(filename)s@%(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',
        ,
    

使用 django-colors-formatter 的控制台日志输出示例:

【讨论】:

通过pip install git+https://github.com/tiliv/django-colors-formatter.git安装 这个包似乎被废弃了。 5年来,它没有受到任何关注。尝试改用coloredlogs。这是一个通用的 python 包,可以很好地与 Django 配合使用。【参考方案3】:

我还想要 dev_appserver 的颜色输出。我在这里找到了一些 OTT 的解决方案(我想要的只是让我的 logging.error() 调用脱颖而出。我最终通过将它放在我的 main.py 中作为快速解决方案对日志模块进行了猴子补丁:

# 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

这仅适用于 ANSI 颜色的终端。

【讨论】:

【参考方案4】:

这是一个示例格式化程序:

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)    

你需要配置它,例如:

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

【讨论】:

【参考方案5】:

您链接到的答案中提到的重置代码将在本地开发服务器的控制台上工作(但可能需要一些调整 - 您必须将其与现有的 App Engine 日志处理程序链接起来),但不会无法在生产环境中工作,因为在生产环境中,日志条目会输出到管理控制台中的 html 页面。

但是,您可以在管理控制台中按日志级别进行过滤。

【讨论】:

感谢您的回答,尼克。这是我遇到麻烦的链接部分。 :)【参考方案6】:

我不认为你应该为此创建一个记录器子类——airmind 的回答很好,只要创建一个专门的Formatter 并指定它在StreamHandler 上的用途。但是不需要记录器子类。事实上,airmind 使用 logger 类为每个创建的 logger 添加了一个处理程序,这不是你想要的。

airmind 提供的解决方案仅适用于支持 ANSI 转义序列的终端 - 你确定你的控制台支持它们吗?

【讨论】:

谢谢维奈。是的,我的终端支持 ANSI 颜色。【参考方案7】:

我使用了coloredlogs 包。与DJANGO_COLORS 不同,它不特定于 Django 命令,与django-colors-formatter 不同,它得到积极维护。

我在我的日志记录配置中添加了一行,现在我得到了可配置的彩色日志。

logging.config.dictConfig(
    ...
    'formatters': 
        'console': 
            # This line right here:
            "()": "coloredlogs.ColoredFormatter",
            'format': '%(asctime)s %(levelname)s [%(name)s:%(lineno)s] %(message)s',
        ,
    ,
    ...

【讨论】:

【参考方案8】:

安装colorlog

(别忘了把colorlog放到INSTALLED_APPS

在您的格式化程序

中创建“彩色”
 'colored': 
        '()': 'colorlog.ColoredFormatter',
        'format': "%(log_color)s %(levelname)-8s %(asctime)s %(module)s %(reset)s %(blue)s%(message)s",
    

settings.py 中记录器的完整示例

LOGGING = 
'version': 1,
'disable_existing_loggers': False,
'formatters': 
    'colored': 
        '()': 'colorlog.ColoredFormatter',
        'format': "%(log_color)s %(levelname)-8s %(asctime)s %(module)s %(reset)s %(blue)s%(message)s",
    
,
'handlers': 
    'console': 
        'class': 'logging.StreamHandler',
        'formatter': 'colored'
    ,
,
'root': 
    'handlers': ['console'],
    'level': 'WARNING',
,
'loggers': 
    'django': 
        'handlers': ['console'],
        'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        'propagate': False,
     ,
  ,

【讨论】:

【参考方案9】:

这是我使用 colorlog 的 Django 解决方案。它只是为简单的 django 消息着色。您只需将其放入您的settings.py

pip install colorlog
LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': 
        'special': 
            '()': 'colorlog.ColoredFormatter',
            'format': '%(log_color)s[%(asctime)s] %(message)s'
        
    ,
    'filters': 
        'require_debug_true': 
            '()': 'django.utils.log.RequireDebugTrue',
        ,
    ,
    'handlers': 
        'console': 
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'special'
        
    ,
    'loggers': 
        'django': 
            'handlers': ['console'],
            'propagate': True,
        
    

Screen

【讨论】:

以上是关于如何在 Django/Google App Engine 中制作日志颜色?的主要内容,如果未能解决你的问题,请参考以下文章

Populate() 不是可重入的 Django Google App Engine

我的Android进阶之旅如何判断Android设备系统的构建模式类型,是useruserdebug还是eng类型?

汉语拼音en与eng的发音有何区别

如何获取 android app uids

eng和rus的区别

android MTK平台 user/eng 版本的差别