前段时间,我看到一个带有彩色输出的Mono应用程序,可能是因为它的日志系统(因为所有的消息都是标准化的) .
现在,Python有 logging
模块,它允许您指定许多选项来自定义输出 . 所以,我想象Python可能会有类似的东西,但我无法在任何地方找到如何做到这一点 .
有没有办法让Python logging
模块输出颜色?
我想要的(例如)红色错误,蓝色或黄色调试消息,等等 .
当然这可能需要一个兼容的终端(大多数现代终端);但如果不支持颜色,我可以回退到原来的 logging
输出 .
有关如何使用记录模块获得彩色输出的任何想法?
24 回答
我从airmind支持前景和背景标签更新了示例 . 只需在日志格式化程序字符串中使用颜色变量$ BLACK - $ WHITE . 设置背景只需使用$ BG-BLACK - $ BG-WHITE .
所以现在您可以在配置文件中简单地执行以下操作:
我有两个要添加的提交,其中一个只为消息着色(ColoredFormatter),其中一个着色整行(ColorizingStreamHandler) . 这些还包括比以前的解决方案更多的ANSI色码 .
一些内容来自(修改)来自:上面的帖子,和http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
仅为消息着色:
整色线着色:
我已经知道了颜色逃逸,我刚才在我的bash提示中使用过它们 . 不管怎么说,还是要谢谢你 .
我想要的是将它与日志记录模块集成,我最终在经过几次尝试和错误之后做了 .
这是我最终得到的:
要使用它,请创建自己的Logger:
以防万一其他人需要它 .
如果您使用多个 Logger 或处理程序,请小心:
ColoredFormatter
正在更改记录对象,该记录对象将进一步传递给其他处理程序或传播到其他记录程序 . 如果你已经配置了文件 Logger 等,你可能最好在操作levelname属性之前简单地创建一个带有copy.copy()
的record
副本,或者在返回格式化字符串之前将levelname重置为前一个值(信用证为Michael in评论) .几年前我写了一个彩色的流处理程序供我自己使用 . 然后我遇到了这个页面,发现了一些人们正在复制/粘贴的代码片段:-( . 我的流处理程序目前只适用于UNIX(Linux,Mac OS X),但优点是它是available on PyPI(和GitHub)和它很简单易用 . 它还有一个Vim语法模式:-) . 将来我可以将其扩展到Windows上 .
To install the package:
To confirm that it works:
To get started with your own code:
上例中显示的默认日志格式包含日期,时间,主机名, Logger 名称,PID,日志级别和日志消息 . 这就是它在实践中的样子:
这是一个适用于任何平台的解决方案 . 如果它不只是告诉我,我会更新它 .
工作原理:在支持ANSI转义的平台上使用它们(非Windows),在Windows上,它确实使用API调用来更改控制台颜色 .
该脚本会破坏标准库中的logging.StreamHandler.emit方法,为其添加包装器 .
TestColorer.py
Colorer.py
针对预定义日志级别的快速而脏的解决方案,无需定义新类 .
Update :因为这是一个让我长时间搔痒的痒,我继续为像我这样只想简单做事的懒人写了一个图书馆:zenlog
Colorlog非常适合这种情况 . 它是available on PyPI(因此可以通过
pip install colorlog
安装)并且是actively maintained .这是一个快速复制和粘贴的代码片段,用于设置日志记录和打印体面的日志消息:
输出:
您可以导入colorlog模块并使用其
ColoredFormatter
来着色日志消息 .示例
主模块的锅炉板:
如果安装了colorlog模块并且输出实际上发送到终端,则代码仅启用日志消息中的颜色 . 这样可以避免在重定向日志输出时将转义序列写入文件 .
此外,设置自定义颜色方案,更适合具有深色背景的终端 .
一些示例记录调用:
输出:
请看以下解决方案 . 流处理程序应该是着色的东西,然后你可以选择着色单词而不是整行(使用Formatter) .
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
我将Sorin提供的原始示例和子类化的StreamHandler修改为ColorizedConsoleHandler .
该他们的解决方案的缺点是它修改了消息,因为这正在修改实际的logmessage,任何其他处理程序也将获得修改后的消息 .
由于我们使用多个 Logger ,因此在我们的案例中导致了带有颜色代码的日志文件 .
下面的类只适用于支持ansi的平台,但是向它添加windows颜色代码应该是微不足道的 .
现在有一个已发布的PyPi模块可用于可自定义的彩色日志输出:
https://pypi.python.org/pypi/rainbow_logging_handler/
和
https://github.com/laysakura/rainbow_logging_handler
支持Windows
支持Django
可自定义的颜色
由于它是作为Python egg分发的,因此很容易为任何Python应用程序安装 .
airmind方法的另一个小混音,将所有内容保持在一个类中:
要使用将格式化程序附加到处理程序,例如:
用于着色任何终端文本的简单但非常灵活的工具是'colout' .
'myprocess'输出中与正则表达式组1匹配的任何文本将使用color1,第2组使用color2等进行着色 .
例如:
即第一个正则表达式组(parens)与日志文件中的初始日期匹配,第二个组匹配python文件名,行号和函数名称,第三个组匹配之后的日志消息 . 我还使用'粗体/法线'的并行序列以及颜色序列 . 这看起来像:
请注意,与我的任何正则表达式不匹配的行或部分行仍然会回显,因此这不像'grep --color' - 没有任何内容从输出中过滤掉 .
显然这很灵活,你可以在任何进程中使用它,而不仅仅是拖尾日志文件 . 我通常只要想要为某些东西着色,就可以动态地制作一个新的正则表达式 . 出于这个原因,我更喜欢colout到任何自定义日志文件着色工具,因为我只需要学习一个工具,无论我着色的是什么:日志,测试输出,语法突出显示终端中的代码片段等 .
它还避免在日志文件本身中实际转储ANSI代码,这是一个坏主意,因为它会破坏日志文件中的模式,除非你总是记得匹配grep正则表达式中的ANSI代码 .
有很多回应 . 但没有人在谈论装饰者 . 所以这是我的 .
因为它更简单 .
不需要导入任何东西,也不需要编写任何子类:
这将错误设置为红色,将调试消息设置为蓝色,等等 . 就像问题中的问题一样 .
我们甚至可以调整包装器来获取
color
参数来动态设置消息的颜色使用logger.debug("message", color=GREY)
编辑:所以这里是适应装饰器在运行时设置颜色:
好吧,我想我也可以添加我的彩色 Logger 的变化 .
这并不奇怪,但它使用起来非常简单,并且不会更改记录对象,从而避免在使用文件处理程序时将ANSI转义序列记录到日志文件中 . 它不会影响日志消息格式 .
如果您已经在使用logging module's Formatter,那么要获得彩色级别名称,您只需要使用ColoredFormatter替换您的律师处理程序Formatter . 如果您要记录整个应用程序,则只需要为顶级 Logger 执行此操作 .
colored_log.py
示例用法
app.py
sub_module.py
结果
Terminal output
app.log 内容
当然,您可以根据需要设置格式化终端和日志文件输出 . 只有日志级别才会着色 .
我希望有人觉得这很有用,而且不仅仅是太多了 . :)
Python示例文件可以从这个GitHub Gist下载:https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
这是我的解决方案:
我遇到麻烦的是正确设置格式化程序:
然后使用:
虽然其他解决方案似乎很好,但他们有一些问题 . 有些人会对整行进行着色,有些时候不需要,有些则省略了你们可能拥有的任何配置 . 以下解决方案不会影响除消息本身之外的任何内容 .
Code
Example
Output
如您所见,其他所有内容仍然会输出并保持其初始颜色 . 如果您想要更改除消息之外的任何内容,您只需将颜色代码传递给
log_format
即可例 .这是包含颜色代码的枚举:
这可以应用于每个日志级别的名称 . Be aware that this is a monstrous hack.
请注意,您的日志格式化程序必须包含日志级别的名称
例如:
使用pyfancy .
例:
只是另一种解决方案,ZetaSyanthis的颜色:
从
__main__
函数中调用一次 . 我有类似的东西:它还验证输出是否为控制台,否则不使用任何颜色 .
用法
Logger("File Name").info("This shows green text")
在类似问题上回答相同:Python | change text color in shell
想法是使用clint库 . 它支持MAC,Linux和Windows shell(CLI) .