pythonでログを取る方法
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
ログのフォーマットを指定するオブジェクト。
使用例
公式のチュートリアルをつまんで動かしてみるのがよさそう。
構造化ログ
Json形式でログを出力する方法。
Json形式だと検索性が高くなるため、elasticsearchなどのログ収集ツールと組み合わせて使うのが一般的だと思われる。
非同期的な動作が多く、ログが目視で整理しづらいソフトウェアなどで利用される?
構造化ログについて
- メリット: 大量のログを集約し、検索や解析が容易になる。大規模なシステムやマイクロサービスアーキテクチャに適している。
- デメリット: システム全体の設定が必要。また、ElasticsearchやLogstashの知識が必要。そのままだとログが読みにくい。
使用例
loggingモジュールを使ってもできるっぽいが、structlogというライブラリを使うのがお手軽。
structlog + elasticsearch + logstash + filebeat の組み合わせでログを収集する。
いつか記事を書きます。多分。
外部サービスを利用する。
Rollbar,Sentry などの外部サービスを利用する方法。
まともに使おうとするとお金がかかるので試していないが、使ってみると便利なのかもしれない。
- メリット: お手軽にログを集約し、検索や解析が容易になる。
- デメリット: カスタマイズが難しい。お金がかかる。
まとめ
printでいいならprint。
実際、現実的に使うとすれば、loggingモジュールの利用が一般的だと思う。
大規模アプリケーションやバッチ利用が多いケース、モジュールの独立性が高いケースでは構造化ログを使うと時系列でのログが見れたりしていいのかも。
後からの切り替えも面倒だし、必要なら最初から構造化ログを使うのがよさそう?
Discussion