Help us understand the problem. What is going on with this article?

Pythonのターミナル出力に色付けする。

coloredlogsというモジュールを使用する。

pip install coloredlogs

単純なPRINTの色付け

import logging
import coloredlogs

class bcolors:
    # https://godoc.org/github.com/whitedevops/colors
    BGRED = '\033[41m'
    BGGREEN = '\033[42m'
    BGYELLOW = '\033[43m'
    BGBLUE = '\033[44m'
    BGMAGENDA = '\033[45m'
    BGCYAN = '\033[46m'
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    BLUE = '\033[94m'
    MAGENDA = '\033[95m'
    CYAN = '\033[96m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'


logger = logging.getLogger()
coloredlogs.install(level='DEBUG', logger=logger)

print(bcolors.BLUE + "------- Colored STDOUT Test -------" + bcolors.ENDC)

これで色付けされて出力されるはず。部分的な色付けも可能。

loggerとの組み合わせ

loggerと組み合わせて、ファイルに書き込みつつ、標準出力にも出す。

import logging
import coloredlogs

coloredlogs.CAN_USE_BOLD_FONT = True
coloredlogs.DEFAULT_FIELD_STYLES = {'asctime': {'color': 'green'},
                                    'hostname': {'color': 'magenta'},
                                    'levelname': {'color': 'black', 'bold': True},
                                    'name': {'color': 'blue'},
                                    'programname': {'color': 'cyan'}
                                    }
coloredlogs.DEFAULT_LEVEL_STYLES = {'critical': {'color': 'red', 'bold': True},
                                    'error': {'color': 'red'},
                                    'warning': {'color': 'yellow'},
                                    'notice': {'color': 'magenta'},
                                    'info': {},
                                    'debug': {'color': 'green'},
                                    'spam': {'color': 'green', 'faint': True},
                                    'success': {'color': 'green', 'bold': True},
                                    'verbose': {'color': 'blue'}
                                    }

logger = logging.getLogger(__file__)
coloredlogs.install(level='INFO', logger=logger, fmt='%(asctime)s : %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
handler = logging.FileHandler('output.log', 'w', 'utf-8')
handler.setFormatter(logging.Formatter('%(asctime)s : %(levelname)s : %(message)s', datefmt='%Y/%m/%d %H:%M:%S'))
logger.addHandler(handler)

logger.error("This is ERROR!")
logger.warning("This is WARNING.")
logger.info("This is INFO.")
logger.debug("This is DEBUG..")  # Not Printed

DEFAULT_FIELD_STYLES、DEFAULT_LEVEL_STYLESを変更することで、特定の部分やログのレベルの色を変更することが可能。

デフォルト値などは以下のリンクを参照。
https://coloredlogs.readthedocs.io/en/latest/api.html#id24

課題

色+太字(color and bold)も可能らしいが、できない。

print(bcolors.BLUE + bcolors.BOLD +"------- Colored STDOUT Test -------" + bcolors.ENDC)

ただの青になる…

BOLDBLUE = '\033[1;94m'
print(bcolors.BOLDBLUE + "------- Colored STDOUT Test -------" + bcolors.ENDC)

ただの青になる…

>>> RED = '\033[91m'
>>> BOLD = '\033[1m'
>>> ENDC = '\033[0m'
>>> print(RED+'TEST'+ENDC)
TEST
>>> print(RED+BOLD+'TEST'+ENDC)
TEST

ここだと表現できないが、インタープリタで上記ならOK。調査中。

出力を標準出力にしたい

coloredlogs.installを行うとデフォルトではstderrがハンドラとして自動的に追加されるらしい。
そのため、正確にはこれは標準エラー出力に出ていると思うのだが、stream=sys.stdoutを指定すると、コンソール実行の場合うまく色がつかない…。調査中。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away