Pythonで色つきログを - rainbow_logging_handler をPyPIにリリースしました

rainbow_logging_handlerスクリーンショット

rainbow_logging_handlerPyPIパッケージとしてリリースしました. 上のスクショのようにカラフルにPythonでログが表示できます.

売りポイント

☆簡単に使える

デフォルトの使い方でも綺麗に色付けされます.

☆自由度の高い色カスタマイズ

下記のように,色は(変えたければ)細かく指定することができます.

☆ログ内容と色付けが分離されている

標準モジュールのloggingでフォーマットを指定し,その色をrainbow_logging_handler.RainbowLoggingHandlerで調整(あるいはデフォルト色を利用)という風に使います.

☆ログのカラム(時刻,ファイル名,メッセージなど)毎に異なる色が付けられる

対抗馬と思われるlogutils.colorize.ColorizingStreamHandlerはログ1行ごとにしか無理.

☆どこでも使える

Python 2.6, 2.7, 3.2, 3.3 でテストしてます. Linux, Windowsでは色も確認済み.おそらくMac OSとかBSDとかでも動きます. 更に更に,Public Domainです.

インストール

pipとかeasy_installで入ります.

$ pip install rainbow_logging_handler
$ # または
$ easy_install rainbow_logging_handler

使い方

基本の使い方

# -*- coding: utf-8 -*-
import sys
import logging
from rainbow_logging_handler import RainbowLoggingHandler

def main_func():
    # `logging` モジュールを使うための準備
    logger = logging.getLogger('test_logging')
    logger.setLevel(logging.DEBUG)

    # `RainbowLoggingHandler` を使う準備
    handler = RainbowLoggingHandler(sys.stderr)
    logger.addHandler(handler)

    # 多彩なログレベルで出力
    logger.debug("デバッグ")
    logger.info("インフォ")
    logger.warn("警告")
    logger.error("エラー")
    logger.critical("深刻なエラー")
    try:
        raise RuntimeError("例外も色つきます")
    except Exception as e:
        logger.exception(e)

if __name__ == '__main__':
    main_func()

色とログフォーマットのカスタマイズ

# -*- coding: utf-8 -*-
import sys
import logging
from rainbow_logging_handler import RainbowLoggingHandler

def main_func():
    # `logging` モジュールを使うための準備
    logger = logging.getLogger('test_logging')
    logger.setLevel(logging.DEBUG)
    ## フォーマットのカスタマイズ
    formatter = logging.Formatter('%(pathname)s [%(module)s] - %(funcName)s:L%(lineno)d : %(message)s')

    # `RainbowLoggingHandler` を使う準備
    handler = RainbowLoggingHandler(
        sys.stderr,
        ## 色のカスタマイズ.
        ## `pathname`, `module`, ... など,`logging.Formatter()` で使用したカラムの色を調整
        color_pathname=('black', 'red'  , True), color_module=('yellow', None, False),
        color_funcName=('blue' , 'white', True), color_lineno=('green' , None, False),
    )
    handler.setFormatter(formatter)
    logger.addHandler(handler)

    # カスタムしたフォーマット,色で出力
    logger.debug("デバッグ")

if __name__ == '__main__':
    main_func()

開発の経緯

Pythonで色付けられそうなロガーを頑張って探した結果,一番よさげなのが http://opensourcehacker.com/2013/03/14/ultima-python-logger-somewhere-over-the-rainbow/ でした.

でもPyPIパッケージじゃないしライセンス的にもあんまり嬉しくなかったので, 作者の@moo9000さんに「パッケージにしてよ」と言ったら「自分でやれ」って言われて作りました・・・

パッケージ化の過程で色のカスタマイズとか小回りをよくした結果が今のrainbow_logging_handlerです.

終わりに,そしてお詫び

ログはカラフルな方が見る気が起きるような気がします. 皆様の開発の助けになれば幸いです.

バグ報告やpullreqはGithub:rainbow_logging_handlerまでお願いします.

この記事はPython Advent Calendar 2013の記事として書きました.

元々は「ユニットテスト, カバレッジ計測, ドキュメント生成なんかの開発ベストプラクティス書きます」と言っていたのですが, それより喜ぶ人の多そうなカラフルなログの話にしちゃいました・・・

ベストプラクティス云々はまたの機会に!