python PyCharm日志记录输出颜色

fd3cxomn  于 2022-10-30  发布在  Python
关注(0)|答案(7)|浏览(235)

我正在使用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!')

但颜色是一样的。

编辑:
来自JetBrains issue tracker的回应:将代码段的第55行从sys.stderr更改为sys.stdout。stderr流总是用红色着色,而stdout不是。
现在颜色已正确显示。

rur96b6h

rur96b6h1#

至少从PyCharm 2017.2开始,您可以通过启用以下功能来实现:
执行|编辑配置...|组态设定|在输出控制台中仿真终端

vecaoik1

vecaoik12#

PyCharm本身并不支持这个特性,但是你可以下载Grep Console plugin并设置你喜欢的颜色。
以下是截图:http://plugins.jetbrains.com/files/7125/screenshot_14104.png(链路失效)
我希望它能有所帮助:)虽然它没有提供完全彩色的控制台,但它是朝着它迈出的一步。

cfh9epnr

cfh9epnr3#

迟到了,但任何人与这个问题,这里的解决方案,为我工作:

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

这来自于这个答案

gz5pxeao

gz5pxeao4#

2019年9月:PyCharm社区2019.1

PyCharm将所有日志(包括信息/调试)着色为红色
结果是:这不是PyCharm的问题,这是默认的logging的配置方式。PyCharm将写入sys.stderr的所有内容标为红色。当使用不带参数的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日志。

lp0sw83n

lp0sw83n5#

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

bis0qfac

bis0qfac6#

PyCharm 2019.1.1(Windows 10,1709)-按原样运行snippet-工作正常。

错误setFormatter -不起作用。
修复:在第67行进行更改,并在第70-71行删除(添加未格式化的处理程序)。

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

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

第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)
...

ecr0jaav

ecr0jaav7#

我发现了下面的解决方案。显然Pycharm从sys module documentation重定向sys.stdout:

sys.__stdin__
sys.__stdout__
sys.__stderr__

这些对象在程序开始时包含stdin、stderr和stdout的原始值。它们在终止过程中使用,并且无论sys.std* 对象是否被重定向,都可以用于打印到实际的标准流。
如果实际文件被损坏的对象覆盖,它还可以用于将实际文件还原为已知的工作文件对象。但是,执行此操作的首选方法是在替换之前显式保存以前的流,然后还原保存的对象。
因此,要解决这个问题,您可以将输出重定向到sys.__stdout__。示例配置来自我的log_config.yml:

console:
  class: logging.StreamHandler
  level: DEBUG
  stream: "ext://sys.__stdout__"
  formatter: colorFormatter

相关问题