📝

pythonでログを取る方法

2024/07/30に公開

pythonでログを取る方法

簡素な方法からリッチな順番に並べていく。

print()

これでいいなら。

使用例

print("Hello, World!")
  • メリット: かんたん
  • デメリット: 出力先がコンソールのみ。ログレベルの制御ができない。

io

ファイルに書き込む。
これをやるくらいなら、loggingモジュールを使ったほうがいいかもしれない。

  • メリット: コンソール以外にもお手軽に出力できる。
  • デメリット: ログレベルの制御ができない。

使用例

with open("log.txt", "w") as f:
    f.write("Hello, World!")

標準出力をリダイレクトするのも手。

import sys
sys.stdout = open("log.txt", "w")
print("Hello, World!")

loggingモジュール

Python標準のログライブラリ。
logger, handler, formatterの要素でログを制御する。
ここからがログという感じがする。

  • メリット: ログレベルの制御が可能。また、複数の出力先(コンソール、ファイル、ネットワーク等)に対応。
  • デメリット: 複雑なロギングを行おうとすると設定が大変。基本的に平文で出力するため、検索性が低い。

logger

ログメッセージを作成するオブジェクト。
handlerを設定して、ログの出力先やフォーマットを制御することができる。

handler

ログの出力先を指定するオブジェクト。
formatterを設定して、ログのフォーマットを制御することができる。
使うハンドラはこれくらい?

  • StreamHandler
    標準出力や標準エラー出力に出力
  • FileHandler
    ファイルに出力
  • RotatingFileHandler
    ローテーションファイルに出力
  • TimedRotatingFileHandler
    時間ベースのローテーションファイルに出力

formatter

ログのフォーマットを指定するオブジェクト。

使用例

公式のチュートリアルをつまんで動かしてみるのがよさそう。
https://docs.python.org/ja/3/howto/logging.html#logging-basic-tutorial

構造化ログ

Json形式でログを出力する方法。
Json形式だと検索性が高くなるため、elasticsearchなどのログ収集ツールと組み合わせて使うのが一般的だと思われる。
非同期的な動作が多く、ログが目視で整理しづらいソフトウェアなどで利用される?

構造化ログについて
https://newrelic.com/jp/blog/how-to-relic/structured-logging

  • メリット: 大量のログを集約し、検索や解析が容易になる。大規模なシステムやマイクロサービスアーキテクチャに適している。
  • デメリット: システム全体の設定が必要。また、ElasticsearchやLogstashの知識が必要。そのままだとログが読みにくい。

使用例

loggingモジュールを使ってもできるっぽいが、structlogというライブラリを使うのがお手軽。
structlog + elasticsearch + logstash + filebeat の組み合わせでログを収集する。
いつか記事を書きます。多分。

外部サービスを利用する。

Rollbar,Sentry などの外部サービスを利用する方法。
まともに使おうとするとお金がかかるので試していないが、使ってみると便利なのかもしれない。

  • メリット: お手軽にログを集約し、検索や解析が容易になる。
  • デメリット: カスタマイズが難しい。お金がかかる。

まとめ

printでいいならprint。

実際、現実的に使うとすれば、loggingモジュールの利用が一般的だと思う。
大規模アプリケーションやバッチ利用が多いケース、モジュールの独立性が高いケースでは構造化ログを使うと時系列でのログが見れたりしていいのかも。
後からの切り替えも面倒だし、必要なら最初から構造化ログを使うのがよさそう?

GitHubで編集を提案

Discussion