如果正在编写 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)
...其中 contrib.utils 是我将上面链接中的airmind代码放到他的SO答案中的地方。
但是,这似乎对 GAE 控制台的输出没有任何影响,它仍然采用原始格式+纯色。
我们使用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',
},
}
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 的示例控制台日志输出:
我还想要 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 颜色终端。
虽然这不是OP想要的(每行按级别着色),但我想分享一个不错的日志输出着色替代方案,称为
rich
- 一个很棒的库,用于在终端中显示各种富文本内容,作者:@will-mcgugan。
激活 Django 日志的
rich
着色很简单:使用 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,
},
},
}
(这是 Django 日志记录文档 的修改示例)。这将产生如下终端日志:
格式自定义像往常一样通过传递处理程序参数来完成。例如。打开丰富的回溯并隐藏时间戳列:
LOGGING = {
...
'handlers': {
'console': {
'class': 'rich.logging.RichHandler',
'rich_tracebacks': True,
'show_time': False,
},
},
}
将会产出
可以更改颜色,但不能通过日志配置,因为每行都会应用多种颜色和样式;您必须提供自定义主题。将
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
}
有关更多详细信息,请参阅样式文档。要检查可用的主题键和默认值,请发出
$ python -m rich.theme
并查找前缀为
log.
或 logging.
的键。
请注意,
rich
不仅仅是彩色日志记录;去看看吧:
$ python -m pip install rich
$ python -m rich
特别是对于日志记录用例,请查看
的输出$ python -m rich.logging
查看比屏幕截图更多的渲染示例。
这是一个示例格式化程序:
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,)
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',
},
},
...
您链接到的答案中提到的重置代码将在本地开发服务器的控制台上运行(但可能需要一些调整 - 您必须将其与现有的 App Engine 日志处理程序链接起来),但不起作用在生产中,因为在生产中日志条目会输出到管理控制台中的 HTML 页面。
但是,您可以在管理控制台中按日志级别进行过滤。
我不认为你应该为此创建一个记录器子类 - 只要创建一个专门的
Formatter
并指定其在 StreamHandler
上的使用,airmind 的答案就很好。但不需要记录器子类。事实上,airmind 使用记录器类为每个创建的记录器添加了一个处理程序,这不是您想要的。
airmind 提供的解决方案仅适用于支持 ANSI 转义序列的终端 - 您确定您的控制台支持它们吗?
安装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,
},
},
}
这是我使用 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,
}
}
}