goのcologのような色付きのloggingをpythonの標準ライブラリのみで行うためのメモ
goのcologのような色付きのloggingをpythonの標準ライブラリのみで行うためのメモ。
colog?
色付きのログ出力は色々あるけれど。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") }
色の定義自体はこのあたりに書いてある
真似して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の履歴)。