PyCharm logging output colours
PythonGoogle App-EngineLoggingPycharmPython Problem Overview
I'm using PyCharm to develop a GAE app in Mac OS X. Is there any way to display colours in the run console of PyCharm?
I've set a handler to output colours in ansi format. Then, I've added the handler:
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!')
But the colour is the same.
EDIT:
A response from JetBrains issue tracker: Change line 55 of the snippet from sys.stderr to sys.stdout. stderr stream is always colored with red color while stdout not.
Now colours are properly displayed.
Python Solutions
Solution 1 - Python
As of at least PyCharm 2017.2 you can do this by enabling:
Run | Edit Configurations... | Configuration | Emulate terminal in output console
Solution 2 - Python
PyCharm doesn't support that feature natively, however you can download the Grep Console plugin and set the colors as you like.
Here's a screenshot:
http://plugins.jetbrains.com/files/7125/screenshot_14104.png</strike> (link is dead)
I hope it helps somewhat :) although it doesn't provide fully colorized console, but it's a step towards it.
Solution 3 - Python
Late to the party, but anyone else with this issue, here's the solution that worked for me:
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
This came from this answer
Solution 4 - Python
Sept. 2019: PyCharm Community 2019.1
PyCharm colored all the logs including info/debug in red.
Th upshot is: it is not a PyCharm problem, this is how the default logging
is configured.
Everything written to sys.stderr
is colored red by PyCharm.
When using StreamHandler()
without arguments, the default stream is sys.stderr
.
For getting non-colored logs back, specify logging.StreamHandler(stream=sys.stdout)
in basic config like this:
logging.basicConfig(
level=logging.DEBUG,
format='[%(levelname)8s]: %(message)s',
handlers=[
logging.FileHandler(f'{os.path.basename(__file__)}.log'),
logging.StreamHandler(sys.stdout),
])
or be more verbose:
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
This fixed my red PyCharm logs.
Solution 5 - Python
What solved it for me (on PyCharm 2017.2) was going to Preferences -> Editor -> Color Scheme -> Console Colors
and changing the color of Console -> Error output
. Of course this also changes the error color but at least you don't see red all the time...
Solution 6 - Python
PyCharm 2019.1.1 (Windows 10, 1709) - runned snippet as is - works correctly.
Bug: setFormatter - does not work.
Fix: make change in line 67 and get rid on line 70-71 (unformatted handler adding).
self.stream.write(record.msg + "\n", color)
to
self.stream.write(self.format(record) + "\n", color)
Line 70-71 can be moved under manual file run construction for save test ability:
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")
Compared it with standard 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)
...
Solution 7 - Python
I discovered the following solution. Apparently Pycharm redirects sys.stdout. From the sys module documentation:
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.
Therefore, to solve this issue you can redirect output to sys.__stdout__
. Example configuration from my log_config.yml:
console:
class: logging.StreamHandler
level: DEBUG
stream: "ext://sys.__stdout__"
formatter: colorFormatter