nikkie-ftnextの日記

イベントレポートや読書メモを発信

聞いて聞いて! 8/31(土)のPyCon mini Shizuoka 2024にて、Pythonのロギングの話をします。静岡で僕と握手! #pyconshizu

はじめに

静岡といえば、ゆるキャン△。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

  • キーノートが清水川さん
  • トーク9本のタイトル・発表者
    • 清水川さん、トークもされるらしい

ライブラリ開発者に贈る「ロギングで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モジュールが使える

オーディエンスに求める前提知識

  • 「ロギング」とはなにか知っていて、Pythonのloggingモジュールを触ったことがある
  • Python入門者の方も聞いていただけますが、「ロギングとはなにか」というところからの説明はしません

対象者のイメージ

  • import loggingをしているが、loggingモジュールの中身はよく分からず、ハマったら解決できないかもと恐怖を感じながら使っている方(=過去の私)
  • loggingモジュールは難しすぎるので他のライブラリを使って開発しているが、loggingモジュールがどう動いているかやっぱり気になる方
  • 他の人に使ってもらうコード(ライブラリ)を書いているが、ロギングをどう実装すればいいのか自信がない方(「logging.warningってなんで使っちゃいけないの?」=過去の私)

関連アウトプット

終わりに

8/31(土)のPyCon mini Shizuoka 2024で、Pythonのロギングの話をします!
5月に技書博で頒布した『引数の型ヒントをlistにしてはいけません』以来の、再びの「いけません」活動ですね2
静岡の地で話すのは初めてかも。楽しむぞ〜!

最新情報はサイトのお知らせタブTwitterアカウントを見ていくとよさそうです

P.S. 翌日は?

岩手、行っちゃう?


  1. 伝播じゃなくて出力のような気がしています
  2. Python界の七尾百合子を目指してるんですが、やってることは田中琴葉ですね