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

RainbowLoggingHandler

rainbow_logging_handlerをPyPIパッケージとしてリリースしました.
上のスクショのようにカラフルに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で入ります.

1
2
3
$ pip install rainbow_logging_handler
$ # または
$ easy_install rainbow_logging_handler

使い方

基本の使い方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- 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()

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*- 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の記事として書きました.

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

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

author Sho Nakatani a.k.a. laysakura

東京大学大学院 情報理工学系研究科 電子情報学専攻 修士課程で並列分散処理・ストリーム処理・データベースを研究。
2014年4月に株式会社ディー・エヌ・エーにエンジニアスペシャリストとして入社し、ソーシャルゲームのサーバサイド共通基盤の開発に従事。
2016年8月より、オンライン証券会社株式会社FOLIOに入社。バックエンドシステム開発・プロジェクトマネージメント・Engineering Managementに従事。