PyCharm 日志输出颜色

68

我正在使用PyCharm在Mac OS X上开发GAE应用程序。有没有办法在PyCharm的运行控制台中显示颜色?

我已经设置了一个handler以ansi格式输出颜色。然后,我添加了该处理程序:

LOG = logging.getLogger()
LOG.setLevel(logging.DEBUG)
for handler in LOG.handlers:
    LOG.removeHandler(handler)

LOG.addHandler(ColorHandler())

LOG.info('hello!')
LOG.warning('hello!')
LOG.debug('hello!')
LOG.error('hello!')

但是颜色是一样的。

PyCharm run console output

编辑:

来自JetBrains 问题跟踪器 的回复:将代码片段的第55行从sys.stderr更改为sys.stdout。stderr流始终显示为红色,而stdout则不会。

现在颜色已正确显示。


PyCharm是哪种类型的,版本是什么? - Piotr Dobrogost
PyCharm Pro v3.0.2适用于Mac OS X。 - dablak
引用的代码片段已经离线了(也许xsnippet.org也是如此?)- 你能解释一下你在哪里将sys.stderr更改为sys.stdout吗? - neo post modern
1
在您的日志配置处理程序定义中,您还可以简单地添加'stream': sys.stdout来实现此功能。 - Felix Böhme
1
请查看此SO答案 - phoenix
8个回答

81

从至少PyCharm 2017.2开始,您可以通过启用以下选项来实现:

运行 | 编辑配置... | 配置 | 在输出控制台中模拟终端

运行配置

在此输入图片描述


4
这张截图中我使用了 coloredlogs 包。 - phoenix
5
请注意,只有在列表视图中选择了“Python”时,才会显示所示复选框。其他运行类型没有此选项。 - Brian Moeskau
5
PyCharm 2020中无法使用。 - vozman
1
请问您能分享一下现在它在哪里可以获取吗? - vozman
1
没关系,我已经想通了。这个功能只适用于本地解释器。我正在使用远程解释器。 - vozman
显示剩余2条评论

37

6
这个插件很棒!正是我想要的。我也非常喜欢“过滤掉”这个选项。 - dablak
1
插件真是太棒了。为我解决了这个问题。 - Rafe

22

虽然晚了一步,但如果还有人遇到了这个问题,以下是对我有效的解决方案:

import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

这来自于这个回答


18

2019年9月: PyCharm Community 2019.1

PyCharm将所有日志, 包括信息/调试在内,都标记为红色

概括来说: 这不是PyCharm的问题,这是默认的logging配置方式。 使用没有传递参数的StreamHandler()时,默认流是sys.stderr。 要获取非彩色日志,请像以下示例一样在基本配置中指定logging.StreamHandler(stream=sys.stdout):

logging.basicConfig(
    level=logging.DEBUG,
    format='[%(levelname)8s]:  %(message)s',
    handlers=[
        logging.FileHandler(f'{os.path.basename(__file__)}.log'),
        logging.StreamHandler(sys.stdout),
    ])

或者更加冗长:

logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

这解决了我PyCharm日志中红色的问题。


4
我在PyCharm 2017.2上遇到的问题通过以下操作解决了:首选项->编辑器->颜色方案->控制台颜色,修改控制台->错误输出的颜色。当然这也会改变错误信息的颜色,但至少你不用一直看到红色...

3
PyCharm 2019.1.1(Windows 10, 1709)- 按原样运行片段 - 正常工作。 错误:setFormatter - 不起作用。
修复:在第67行进行更改,并消除第70-71行(未格式化的处理程序添加)。
self.stream.write(record.msg + "\n", color)

to

self.stream.write(self.format(record) + "\n", color)

第70-71行可以移动到手动文件运行结构下,以保存测试能力: "Line 70-71可以在手动文件运行结构下移动,以保留测试功能:"
if __name__ == "__main__":
    logging.getLogger().setLevel(logging.DEBUG)
    logging.getLogger().addHandler(ColorHandler())

    logging.debug("Some debugging output")
    logging.info("Some info output")
    logging.error("Some error output")
    logging.warning("Some warning output")

"最初的回答":与标准的StreamHandler进行比较:
import logging
import logging_colored

log_format = logging.Formatter("[%(threadName)-15.15s] [%(levelname)-5.5s]  %(message)s")
logger = logging.getLogger('Main')
logger.setLevel(logging.DEBUG)

console = logging.StreamHandler()
console.setFormatter(log_format)
logger.addHandler(console)

console = logging_colored.ColorHandler()
console.setFormatter(log_format)
logger.addHandler(console)
...


0
我发现了以下解决方案。显然,Pycharm 重定向了 sys.stdout。根据 sys 模块文档 的说明:
sys.__stdin__
sys.__stdout__
sys.__stderr__

这些对象包含程序开始时stdin、stderr和stdout的原始值。它们在finalization期间使用,并且即使sys.std*对象已被重定向,也可以用于打印到实际标准流。
它还可以用于将实际文件恢复为已知工作文件对象,以防它们被覆盖为损坏的对象。但是,最好的方法是在替换之前显式保存先前的流,并恢复保存的对象。
因此,要解决此问题,您可以将输出重定向到sys.__stdout__。以下是我的log_config.yml的示例配置:
console:
  class: logging.StreamHandler
  level: DEBUG
  stream: "ext://sys.__stdout__"
  formatter: colorFormatter

0
Grep Console插件可以根据您的要求为任何模式文本配置任何颜色,例如这个简单的例子:
Scrapy输出的纯文本在原始颜色中为红色,添加此规则后,所有更改都将变为默认的灰色。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接