実践structlog
クラウド時代のログ出力では、JSONによる構造化ログや呼び出し元のコンテキストを含めた出力が必要とされます。このトークではstructlogを使い、実際のWebアプリケーション開発でDjango、Celery、Sentryのコンテキストを繋いでログ出力する例を紹介します。
PyCon JP 2024
Timetable: https://2024.pycon.jp/ja/talk/RRRAAT
Slide: https://docs.google.com/presentation/d/1aST5f0rpdS4jS4pmKC4hbWydHkGCpYpuLwKrZ6u3nb0/pub
GitHub: https://github.com/shimizukawa/structlog-example
Video:
対象
ログはあるけど追うのが大変だと思ってる方
クラウド時代のWebアプリ開発や、そのデバッグで苦労した経験
概要
structlogはOut-Of-The-Boxで簡単に使える便利なログ出力ライブラリ、ではありません。使いやすいラッパーライブラリは気軽に使い始められるメリットがあります。しかし、ある程度複雑な構成で標準ライブラリやフレームワークのログ出力もまとめて扱うには、始めやすさよりも、追跡しやすいログを簡単なコードで手軽に出せることが大事になってきます。 クラウド時代のログ出力では、ログを機械的に扱えるように、構造化されたJSONフォーマットが求められます。また、各ログの追跡可能性を高めるためにはログのコンテキスト情報をフレームワークのログ出力にも含めることが求められます。こういった追跡可能なログによって、トラブル時の調査にかかる労力は大幅に削減されます。 structlogはこのようなニーズに合わせて自由にカスタマイズが可能ですが、そのカスタマイズ性の高さは最初の導入ハードルにもなっています。
アジェンダ
クラウド時代のPython+Webにおけるログ出力に求められる構造化とコンテキスト(3分)
クラウド時代にお勧めのロギングライブラリstructlogについて(5分)
structlogが提供する構造化ログ出力とセットアップ(5分)
structlogのコンテキスト情報出力とその便利な使い方(3分)
structlogのコンテキストをdjangoからceleryに連携する(5分)
structlogのコンテキストをSentryに連携する(5分)
まとめと質疑応答(4分)
サンプルプロジェクト
https://github.com/shimizukawa/structlog-example
参考文献
構造化ログのフォーマット logfmt vs JSON lines - methaneのブログ
structlogとloggingの併用方法について - methaneのブログ
structlogのBoundLoggerについて (1/n) - methaneのブログ
structlogのBoundLoggerについて (2/2) - methaneのブログ
structlogのwrapped loggerとrendererについて - methaneのブログ
structlog.get_logger() と configure() - methaneのブログ
Pythonのstructlogを使いこなす
Logging in Python: A Comparison of the Top 6 Libraries | Better Stack Community
django-structlogによるDjangoログの構造化