如何在Django/Google App Engine中创建日志颜色?

Bri*_*unt 14 python django logging google-app-engine colors

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

我已经从这个问题中复制了有用的解决方案,但我不确定如何将它集成到Django/Google App Engine中.

我想应该将以下内容放在应用程序的main.py中(主要来自这里的示例:在Google App Engine上运行Django):

from contrib.utils import ColouredLogger # from the SO question above
logging.setLoggerClass(ColouredLogger)
Run Code Online (Sandbox Code Playgroud)

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

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

建议和意见将非常感谢.

干杯,布莱恩

Ale*_*mas 20

我们使用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',
    },
}
Run Code Online (Sandbox Code Playgroud)


hoe*_*ing 9

虽然这并不是OP想要的(每行按级别着色),但我想分享一个不错的日志输出着色替代方案,称为rich- 一个很棒的库,用于在终端中显示各种富文本内容,由@will-mcgugan创作。

简单的例子

激活richDjango 日志的着色很简单:使用rich.logging.RichHandler代替logging.StreamHandler,例如

# project/settings.py

...

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'rich.logging.RichHandler',  # <-- this
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
            'propagate': False,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

(这是Django 日志记录文档的修改示例)。这将产生如下终端日志:

django 丰富的日志

更改输出格式

像往常一样,通过传递处理程序参数来完成格式自定义。例如,打开丰富的回溯并隐藏时间戳列:

LOGGING = {
    ...
    'handlers': {
        'console': {
            'class': 'rich.logging.RichHandler',
            'rich_tracebacks': True,
            'show_time': False,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

将产生

在此输入图像描述

更改输出颜色

可以更改颜色,但不能通过日志记录配置,因为每行都会应用多种颜色和样式;您必须提供自定义主题。INFO将标签颜色从默认蓝色更改为粗体洋红色的示例:

import rich
import rich.theme

my_theme = rich.theme.Theme({
    'logging.level.info': 'bold magenta',
})
rich.reconfigure(theme=my_theme)

LOGGING = {
    ...  # no changes here
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅样式文档。要检查可用的主题键和默认值,请发出

$ python -m rich.theme
Run Code Online (Sandbox Code Playgroud)

并查找前缀为log.or的键logging.

尾奏

请注意,这rich不仅仅是彩色日志记录;去检查一下:

$ python -m pip install rich
$ python -m rich
Run Code Online (Sandbox Code Playgroud)

特别是对于日志记录用例,请查看以下输出

$ python -m rich.logging
Run Code Online (Sandbox Code Playgroud)

查看比屏幕截图更多的渲染示例。


Dan*_*ski 7

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',
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1使用我兄弟的创作! (3认同)

Chr*_*loe 5

我还想要 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
Run Code Online (Sandbox Code Playgroud)

这仅适用于 ANSI 彩色终端。