プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/12/21

[Python] コンソールに出力するログに色を付ける

event_note2021/12/20 23:22

ググればやり方はいろいろ見つかり、いろいろ試してみましたが、rich を使うのが一番簡単かつ見栄えがいいかもしれません。

前提

ログに関する設定は yaml ファイルに切り出しています。

coloredlogs を使う方法

pip install coloredlogs
    with open('./logging.yaml', encoding='utf-8') as f:
        logconfig = yaml.safe_load(f)
        config.dictConfig(logconfig)
    coloredlogs.install(level='DEBUG') # 追加

簡単にカラフルに出来ましたが、 logging.yaml の設定が上書きされてしまいました。
他にやり方があるのかもしれません。

colorlog を使う方法

pip install colorlog

logging.yaml で、colorlog を使うように指定し、{log_color} でレベルに合わせた色分けをしてくれます。

version: 1
root:
  level: DEBUG
  handlers: [console]
handlers:
  console:
    class: logging.StreamHandler
    stream: ext://sys.stderr
    formatter: myformatter
formatters:
  myformatter:
    '()': 'colorlog.ColoredFormatter'
    format: "{log_color}{asctime} [{levelname:.4}] {name}: {message}"
    style: "{"

各レベルの色を自分で定義

version: 1
root:
  level: DEBUG
  handlers: [console]
handlers:
  console:
    class: logging.StreamHandler
    stream: ext://sys.stderr
    formatter: myformatter
formatters:
  myformatter:
    '()': 'colorlog.ColoredFormatter'
    format: "{log_color}{asctime} [{levelname:.4}] {name}: {message}"
    style: "{"
    log_colors:
      DEBUG: 'bold_black'
      INFO: 'white'
      WARNING: 'yellow'
      ERROR: 'red'
      CRITICAL: 'bold_red'

一つのログ内で色分けしたい場合

format で以下のように記述すれば OK です。

format: "{cyan}{asctime}  {blue}{name} L{lineno} {bold_black}{levelname}{reset} {log_color}{message}" 

rich を使う方法

コンソールへの出力をリッチにしてくれる Rich というライブラリの RichHandler を使ってログを出力する方法です。

pip install rich
version: 1
root:
  level: INFO
  handlers: [rich]
handlers:
  rich:
    class: rich.logging.RichHandler
    rich_tracebacks: True

これだけで簡単にカラフルなログを出力してくれます。