goのcologのような色付きのloggingをpythonの標準ライブラリのみで行うためのメモ

goのcologのような色付きのloggingをpythonの標準ライブラリのみで行うためのメモ。

colog?

github.com

色付きのログ出力は色々あるけれど。goのcologの表示が手軽で便利そうだったのでこれを参考にすることにした。

このような形で色付きで出力される。

色付き

このときのコード。

main.go

package main

import (
    "log"
    "os"

    "github.com/comail/colog"
)

// https://github.com/comail/colog

func main() {
    colog.Register()
    colog.SetOutput(os.Stdout)
    colog.ParseFields(true)
    colog.SetFlags(log.Ldate | log.Lshortfile)

    log.Print("trace: logging this to stdout")
    log.Print("debug: logging this to stdout")
    log.Print("info: logging this to stdout")
    log.Print("warning: with fields foo=bar")
    log.Print("error: with fields foo=bar")
    log.Print("alert: with fields foo=bar")
}

色の定義自体はこのあたりに書いてある

https://github.com/comail/colog/blob/676c50adc5df1d6649b365a39e8b8dcc17c135e1/std_formatter.go#L14-L30

真似してpythonで実装してみる

いろいろ考えたけれどHandlerで実装するのが一番手軽そうだった。StreamHandlerを拡張する。 (ちなみに他にフックポイントとしてAdapterとFilterがある)

こんな感じのコード。

import logging

logger = logging.getLogger(__name__)

mapping = {
    "TRACE": "[ trace ]",
    "DEBUG": "[ \x1b[0;36mdebug\x1b[0m ]",
    "INFO": "[  \x1b[0;32minfo\x1b[0m ]",
    "WARNING": "[  \x1b[0;33mwarn\x1b[0m ]",
    "WARN": "[  \x1b[0;33mwarn\x1b[0m ]",
    "ERROR": "\x1b[0;31m[ error ]\x1b[0m",
    "ALERT": "\x1b[0;37;41m[ alert ]\x1b[0m",
    "CRITICAL": "\x1b[0;37;41m[ alert ]\x1b[0m",
}


class ColorfulHandler(logging.StreamHandler):
    def emit(self, record: logging.LogRecord) -> None:
        record.levelname = mapping[record.levelname]
        super().emit(record)


logging.basicConfig(handlers=[ColorfulHandler()], level=logging.DEBUG)

logger.debug("hello")
logger.info("hello")
logger.warning("hello")
logger.error("hello")
logger.critical("hello")

(pythonにはalertがなくcriticalがあるのでcriticalをalertということにしてみた)

はい。

色付き

追記

表示をよりcologに寄せるために修正した(diffはgistの履歴)。

gist