すっきり分かる Python のログ

1.8K Views

March 09, 21

スライド概要

アップロードテストかねて。

Python のロガー周りを理解するための資料です。(社内勉強会用)

コードとか:
https://github.com/pistatium/about_python_logging

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

すっきり分かる Python のログ @kimihiro_n

2.

2 この発表の目的 Python で正しくログが扱えるようになる さよなら Print デバッグ 欲しいログを欲しいように! 必要な箇所に絞ったログの取り込み ファイルやコンソールへの出し分け Logger の仕組み自体は他の言語でも Java とか Java とか log.debug('Hello, logging world!!')

3.

3 とりあえず使ってみる logger の初期化 ログを使うための おまじない Logger と呼ばれるインスタンスを作る ファイルごとに作成

4.

4 ログを書き込む ログの書き込み Logger インスタンスのメソッドを呼ぶだけ 重要度合いに応じて5つのレベルが使える

5.

5 ログを見る This is a Warning message This is a Error message This is a Critical message 標準エラー出力に出てきます 5種類のログがで…てない

6.

6 🤔

7.

7 レベルを下げてみる setLevel というメソッドで変更 デフォルトは WARNING これ以下のものは無視される

8.

8 結果 This is a Warning message This is a Error message This is a Critical message

10.

10 Handler なるもの Handler というのを初期化してセット こっちにもレベル設定がある

11.

11 結果 This This This This This is is is is is a a a a a Debug message Info message Warning message Error message Critical message

12.

12 🎉

13.

13 Logging のしくみ

14.

14 おまじない の謎 __name__ if __name__.. のおまじないでお馴染み Python から直接呼ぶと __main__ が入る import して使った場合: このファイルのモジュール名が入る myapp/models/items.py なら myapp.models.items が入る

15.

15 おまじない の謎 2 getLogger の引数 実は文字列ならなんでもいい 渡した文字列が Logger の名前に ̲̲name̲̲ を毎度入れてるのは 名前決めるの面倒くさいから 便利だから

16.

16 Logger の階層関係 Logger は階層を持てる Logger の名前を .(ドット) で区切ると 勝手に階層化される myapp.models.items という名前の Logger は myapp.models myapp root の Logger を親に持つ

17.

17 Handler とは Handler の役割 渡ってきたログを適切に処理する 不要なログのフィルター ログのフォーマット 出力先へログを送る 1つの Logger に対して複数セットできる logger.addHandler

18.

18 Handler の種類 StreamHandler 標準出力などのストリームに書き込む FileHandler ファイルに書き込む RotatingFileHandler FileHandlerのRotateしてくれる版 SMTPHandler メールを送るすごいやつだよ NullHandler 何もしない ほか

19.

19 Formatter ログの書式を指定するためのもの Handler に対して指定できる 使える変数一覧 https://docs.python.jp/3/library/ logging.html#logrecord-attributes formatter = logging.Formatter( '[%(asctime)s:%(name)s:%(levelname)s] %(message)s' ) handler.setFormatter(formatter)

20.

20 https://docs.python.jp/3/howto/logging.html#useful-handlers

21.

21 Logger の動き方 基本の動き 自身の Handler を呼び出し → 1つ親の Logger へ移動 を繰り返す 「親の Logger を呼び出すか」 logger.propergate という属性で制御している False にすると打ち切り デフォルトは True 簡略化のためフィルター等省略しています

22.

22 Handler の動き 基本の動き ログのレベルをみて、 満たしていたら書き込むだけ Formatter で整形して、 自身の書き込み先へ出力 簡略化のためフィルターを省略しています

23.

23 実践編

25.

25 すっきり書きたい 問題点 ログ設定のコードが長い ログ設定を書くのは エントリポイントなどが多い 長いコードで見通し悪くしたくない 解決策 別ファイルに書いて import …… △ 設定ファイルにして読み込む …… ○

26.

26 JSONで書いてみる dictConfig 設定が入った辞書を渡す JSON のパースは自力で 公式Docでは YAML YAMLパーサーは非標準 JSONはビルトイン FileConfig を使ったやり方も

27.

27 まとめ Logger ログを扱うためのインスタンス レベルによるフィルタリングが可能 階層化された名前を持つ 親の Logger へと伝搬する Handler ログの出力を管理する Logger に対し 1対多 で紐付く レベルによるフィルタリングが可能

28.

28 参考 Logging HOWTO - Python3 公式ドキュメント https://docs.python.jp/3/howto/logging.html ログ出力のための print と import logging はやめてほしい - Qiita https://qiita.com/amedama/items/b856b2f30c2f38665701 ノートブック https://github.com/pistatium/about̲python̲logging/blob/master/ about̲logging.ipynb 今回の内容を jupyter notebook 形式でまとめてます