关于python:PyCharm记录输出颜色

PyCharm logging output colours

我正在使用PyCharm在Mac OS X中开发GAE应用程序。是否可以在PyCharm的运行控制台中显示颜色?

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

1
2
3
4
5
6
7
8
9
10
11
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本身不支持该功能,但是您可以下载Grep Console插件并根据需要设置颜色。

这是屏幕截图:
http://plugins.jetbrains.com/files/7125/screenshot_14104.png (链接无效)

我希望它能有所帮助:)尽管它不提供完全彩色的控制台,但这是朝着它迈出的一步。


从PyCharm 2017.2起,您可以通过启用以下功能来执行此操作:

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

Run configuration

enter image description here


晚到晚了,但是有这个问题的其他人,这是对我有用的解决方案:

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

来自这个答案


为我解决的问题(在PyCharm 2017.2上)是转到Preferences -> Editor -> Color Scheme -> Console Colors并更改Console -> Error output的颜色。当然,这也会改变错误的颜色,但至少您不会一直看到红色...


2019年9月:PyCharm社区2019.1

PyCharm将所有日志(包括信息/调试)涂成红色。

结果是:这不是PyCharm问题,这是配置默认logging的方式。
PyCharm将写入sys.stderr的所有内容涂成红色。
使用不带参数的StreamHandler()时,默认流为sys.stderr

为了找回无色日志,请在基本配置中指定logging.StreamHandler(stream=sys.stdout),如下所示:

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

或者更详细:

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

这修复了我的红色PyCharm日志。


PyCharm 2019.1.1(Windows 10,1709)-按原样运行的摘录-正常运行。

>
</p>
<p>
错误:setFormatter-不起作用。
</p>
<p>
修复:在第67行进行更改,并在第70-71行摆脱(添加未格式化的处理程序)。
</p>
<div class=

1
2
self.stream.write(record.msg +"
"
, color)

1
2
self.stream.write(self.format(record) +"
"
, color)

可以将70-71行移至手动文件运行结构下以节省测试能力:

1
2
3
4
5
6
7
8
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进行比较:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
...

>
</p>
<p><center> <script src=


我发现以下解决方案。显然Pycharm重定向sys.stdout。从sys模块文档中:

1
2
3
sys.__stdin__
sys.__stdout__
sys.__stderr__

These objects contain the original values of stdin, stderr and stdout
at the start of the program. They are used during finalization, and
could be useful to print to the actual standard stream no matter if
the sys.std* object has been redirected.

It can also be used to restore the actual files to known working file
objects in case they have been overwritten with a broken object.
However, the preferred way to do this is to explicitly save the
previous stream before replacing it, and restore the saved object.

因此,要解决此问题,您可以将输出重定向到sys.__stdout__。我的log_config.yml中的示例配置:

1
2
3
4
5
console:
  class: logging.StreamHandler
  level: DEBUG
  stream:"ext://sys.__stdout__"
  formatter: colorFormatter