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)
虽然这并不是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 日志记录文档的修改示例)。这将产生如下终端日志:
像往常一样,通过传递处理程序参数来完成格式自定义。例如,打开丰富的回溯并隐藏时间戳列:
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)
查看比屏幕截图更多的渲染示例。
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的控制台日志记录输出示例:

我还想要 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 彩色终端。