2015年07月15日

Python|loggingクラスのしくみ1(概要編)

Pythonのlogging機能のしくみ



こんにちはSTしゃちょー。です。
今回はPythonのloggingクラスの使い方に関して説明します。

loggingクラスを使うことの利点


プログラムを作成している最中にログを出すことは、開発を効率的に進める上で必要不可欠なことです。初心者の方や比較的小さなプログラムを書く時はloggingクラスを使わず、print文で済ませてしまう人が多いと思います。
print()の場合、loggingクラスに比べて応用がききません。以下に特徴をまとめます。

■print()の特徴
・導入は非常に簡単(ただプログラム内に書き込めばいいだけ)
・後から不要なログだけfilterすることができない
・表示したい行数や関数名を、print()ごとに記述しなければならない
・人によって異なるフォーマットで書いてしまいやすくなる

loggingクラスを使うと、初期設定はprint()より記述しなければならないコードが増えますが、上記にあるようなprint()の短所をすべて克服することができます。


loggingとloggerの関係



150715_logger1.png


loggingクラス自体を使ってログを出力することもできますが、それだと、ファイルごとに出力を変更させるといった柔軟な設定ができなくなってしまいますので、loggingクラスからloggerを作成して、それを使用します。

logging.getLogger <名前>

指定した名前が、loggerそれぞれの名前になります。名前の付け方は、”Y”, “Y.A”, “Y.A.I”のように、「.」で区切って階層的な名前にします。こうすることで、logger同士の親子関係をもたせることができます。たとえば、「”Y”」は「”Y.A”」の親という位置づけになり、”Y”に対して設定を行うと、その内容が”Y.A”にも引き継がれますので、いちいちloggerごとに設定をする手間が省けます。


ログ出力の流れ



150715_logger2.png


プログラムから出力されるログ情報を、まずloggerが受け取ります。一つのプログラムに複数のloggerを設定することも可能です。loggerには複数のHandlerクラスを結びつけることができますので、結びついているすべてのHandlerに対してログを転送します。Handlerクラスはそれぞれ別の出力先と結びついており、あるHandlerは標準出力に、また別のHandlerはファイルに出力する、といったことが可能です。


ログのフィルタリング


Pythonでは2段階でログをフィルタリングすることが可能です。
まず第一段階は、loggerクラスで実施します。プログラムからはdebug, info, warning, error, criticalなどの優先度に分かれたログがloggerに渡されます(自分で他のレベルのものを追加することも可能ですが、その方法に関しては割愛します)。上の図の場合、loggerを通り抜けたところで、debugとinfoがフィルターされています。

第二段階は、各Handlerで実施されます。上の図の場合、Handler1はwarningをフィルタリングしているのに対し、Handler2はwarningとerrorをフィルタリングしています。
各Handlerを通ったログは、出力される前に、フォーマット変換が実施されます。プログラム上に書いたログをそのまま出力することも可能ですし、全ログに対して行数や関数名を出力するようにフォーマット登録しておくと、それらの情報とともにログが出力されます。

この図では、標準出力とファイル出力のみを記載していますが、それ以外にもネット経由で別のPCにログを送信するといったことも可能です。

今回はloggingクラスの概要に関して解説しました。loggingクラスの実践編も是非ご参照ください。




posted by STしゃちょー。 at 21:29| Comment(0) | Python | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。