はじめに
静岡といえば、ゆるキャン△。nikkieです
タイトルが全てです
目次
PyCon mini Shizuoka 2024
8/31(土)静岡で現地開催
開催概要まとめ
https://shizuoka.pycon.jp/2024/article/67
connpassからの参加登録は、7/21(日)12時から
なお本イベントのオンライン配信は今回はございません。
懇親会の申込みは別のconnpassページが準備中のようです。
トークのラインナップは以下で見られます
https://shizuoka.pycon.jp/2024/info
ライブラリ開発者に贈る「ロギングでNullHandler以外はいけません」
PyCon JP向けに出していたプロポーザルをShizuokaにも出していました。
PyCon JPのプロポーザルのフォーマットで転記します
概要
ハンドラはライブラリのユーザーが決めることだからです
Pythonのロギングは正直なところ、とても難しいと感じます。
公式ドキュメントの深くには「ライブラリ内でロガーに NullHandler 以外のハンドラーを追加するのは避けるべき」と記載されているのですが、これはなかなか遵守されていないように見受けられます。
実際NullHandler
以外のハンドラが追加されたライブラリを苦心して使わざるを得ないことが何度もありました
このトークで伝えるのはたった1つ、「ライブラリの中でロギングする際のHandlerは、NullHandlerに限る」ということです。
なぜこの主張に至るのか、ハンドラとはなにか、そもそもPythonのロギングとはなにか、基礎に立ち戻ってお話しします。
logging.info
していたり、NullHandler
以外がaddされたロガーを使っていたりするPythonのライブラリが減るのに、このトークが貢献することを切に願っています。
詳細
主張
このトークは、ライブラリ開発者は以下のようなロギングをしましょう、と主張するものです。
ドキュメントに基づいたプラクティス(ただし全然膾炙していない)の再訪です
https://docs.python.org/ja/3/howto/logging.html#library-config
ライブラリでは以下のようにロギングしよう
import logging logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) def awesome() -> None: logger.warning("ちょっとヤバいよ")
このロギングのよい点は、ライブラリのユーザがロギングを設定できるということです!!
import logging from awesomelib import awesome logging.basicConfig( # ユーザが(ルートロガーを介して)レベルやフォーマット、ロガーを設定している! level=logging.WARNING, format="%(asctime)s | %(levelname)s | %(name)s:%(funcName)s:%(lineno)d - %(message)s", ) awesome()
アウトライン
自己紹介とまとめで1分ずつ(2min)
ライブラリではNullHandlerを使ってロギングしよう(10min)
ライブラリ開発者向けのパート
- ロガーとはなにか
logging.getLogger(__name__)
- ロガーのハンドラとは
- 種々のハンドラを紹介
- なぜNullHandlerが選ばれるのか
- ハンドラ以外の要素を網羅(レベル、フォーマット)
ライブラリをロギングして使う(8min)
ライブラリ利用者向けのパート
logging.basicConfig
の紹介- 設定して使える!(レベル、フォーマット)
logging.basicConfig
は何をやっているのか ー ルートロガー- 子ロガーからルートロガーへの伝播(propagate)
ライブラリ利用者向けパートから、ライブラリ開発者へのメッセージ
「子ロガーが標準出力に出力しなくても、伝播した先のルートロガーで標準出力に伝播(ママ1)すればよい」
NullHandlerを使わない場合どんな問題が起きるか(6min)
- ライブラリの中で、NullHandler以外のハンドラを使った場合 -> propagateするために2重出力
- ライブラリの中で
logging.info
(ルートロガー)を使った場合 -> ユーザがハンドラを外す必要があります
落穂拾い(4min)
- ロガーに階層構造があることで、実は非常に柔軟にロギングを設定できることを共有(ロガーごとのレベル、ハンドラ、フィルタ)
- 復習としてLogging Flowを眺める
この題材を選んだ理由やきっかけ
開発されたライブラリを使う中で、loggingモジュールの使い方がプラクティスに沿っていないために、とても苦しい経験をしてきました。
その中で収穫として「ライブラリではNullHandler以外を使わない」というプラクティスを私は理解できたのですが、コミュニティ全体に目を向けるとこのプラクティスはあまり普及していないように思われます。
なので、「せめて知ったうえで採用するのか無視するのか」開発者各位に判断いただきたく、PyCon JPで話す題材として選びました
オーディエンスが持って帰れる具体的な知識やノウハウ
「Pythonのロギング、学習コストが高いし、実装に比べて調べきれないからもうlogging.warning
でいいや」から卒業できるトークを目指します
- ロガー、ハンドラ、フォーマッタ、フィルタといった概念の大まかな理解
- ルートロガー(
logging.warning
たちやlogging.basicConfig
の裏にあるもの)とロガーの階層構造の理解 - なぜライブラリではNullHandler以外がいけないのかへの納得
- PyConから戻って開発する中で、自信を持ってloggingモジュールが使える
オーディエンスに求める前提知識
対象者のイメージ
import logging
をしているが、loggingモジュールの中身はよく分からず、ハマったら解決できないかもと恐怖を感じながら使っている方(=過去の私)logging
モジュールは難しすぎるので他のライブラリを使って開発しているが、logging
モジュールがどう動いているかやっぱり気になる方- 他の人に使ってもらうコード(ライブラリ)を書いているが、ロギングをどう実装すればいいのか自信がない方(「
logging.warning
ってなんで使っちゃいけないの?」=過去の私)
関連アウトプット
終わりに
8/31(土)のPyCon mini Shizuoka 2024で、Pythonのロギングの話をします!
5月に技書博で頒布した『引数の型ヒントをlistにしてはいけません』以来の、再びの「いけません」活動ですね2。
静岡の地で話すのは初めてかも。楽しむぞ〜!
最新情報はサイトのお知らせタブやTwitterアカウントを見ていくとよさそうです
P.S. 翌日は?
【ミリオン】岩手競馬コラボ決定!第1弾として、4/27(土)・28(日)に「岩手競馬 in ニコニコ超会議2024 -60周年記念コラボ-ブース」にてノベルティ配布いたします! #ミリオンライブ #idolmaster https://t.co/5xnM66mqkW
— アイドルマスター公式 (@imas_official) 2024年4月10日
岩手、行っちゃう?