Flaskアプリのログを詳細に記録する方法を解説

Flaskアプリのログとは?

ログとは、アプリケーションが動作している間、様々なイベントや情報を記録しておく仕組みのことです。Flaskアプリにおいては、リクエストの処理状況、エラー発生時、特定の処理が行われたタイミングなど、様々な情報をログとして残しておくことができます。

ログを残すメリット

  • セキュリティ監査: 不正なアクセスなどのセキュリティに関する情報を記録しておくことで、事後の分析に役立ちます。
  • トラブルシューティング: エラーが発生した際に、ログを調べることで原因を特定しやすくなります。
  • 動作確認: アプリケーションが意図した通りに動作しているかを確認できます。
  • パフォーマンス分析: 処理時間がかかっている部分などを特定し、パフォーマンス改善に役立ちます。

ログのレベル

ログには、以下のレベルがあります。

  • DEBUG: 詳細なデバッグ情報
  • INFO: 一般的な情報
  • WARNING: 注意すべき事象
  • ERROR: エラーが発生した場合
  • CRITICAL: 致命的なエラーが発生した場合

ログレベルを設定することで、出力するログの量を調整できます。

ログの出力先

ログの出力先は、ファイル、コンソール、または専用のログ収集サービスなど、様々な場所に設定できます。

ログのフォーマット

ログのフォーマットは、日付、時間、ログレベル、メッセージなど、様々な情報を含めることができます。

logger.confにloggerの設定を書こう

logを走らせるにあたっては、上に挙げた「ログレベル、出力先、フォーマット」の設定が必要です。logger.confにでは、logの設定を書いていきます。

本記事では、rootとsampleloggerの2つのloggerを走らせます。logger.confの書き方を解説していきましょう。まず、logger, handler, formatterの項目があります。さらに、それぞれについて、[logger_(設定した名前)]の項目に、仕様を書くことになります。

このように、logger.confには

  • [logger]
  • [handler]
  • [formatter]

と、それに対応した仕様書となる

  • [logger_XXX]
  • [handler_XXX]
  • [formatter_XXX]

を書いていきます。

[logger]の項目です。ここに、keys=root, samplelogger の2つのloggerを設定します。
この仕様を決めるのが[logger_XXX]のついた項目です。

次に、[handler]の項目です。これは、loggerで操作させるハンドルのようなものだと思ってください。ハンドラーはログ出力の作法を決めます。そして、このハンドラーのこの仕様を決める仕様書が[handler_XXX]です。

次に、[formatter]の項目です。これは、ログ出力の形式を決めるものです。さらに、[formatter_XXXX]の項目で、フォーマッターの詳細な仕様を記述しています。日付やユーザーネーム、ログを書いた行を書くかどうかを決めることになります。

以上の内容を、簡単に図にまとめたものです。logger.confは、下から上へと、loggerの設定を詳しく書いていきます。順番に見ていきましょう。

loggers

rootとsampleloggerというloggerを走らせます

[loggers]
keys=root, samplelogger

handler

log出力に使うハンドルを決めます。
後で、handler_xxxで仕様書を書きます

[handlers]
keys=consolehandler, filehandler

formatter

フォーマットを決めます
後で、formatter_xxxで仕様書を書きます。

[formatters]
keys=sampleformatter

logger_

rootログの仕様、sampleloggerの仕様を書いています。
ログレベつや、使用するハンドラ、loggerの名称を設定できます。

[logger_root]
level=DEBUG デバッグログを出力
handlers=consolehandler

[logger_samplelogger]
level=DEBUG
handlers=filehandler
qualname=samplelogger 使用名を指定できる
propagate=0 # 1にするとrootロガーも一緒にログ出力してしまってダブる

handler_

consolehandlerの仕様、filehandlerの仕様を書いています。
consolehandlerはターミナルにログを出力する設定にしています。
formatterはsampleformatterを使用しています。
また、標準出力でターミナルに出力する設定にしています。

filehandlerは、出力ファイルを、logs/app.logというファイルにしています。

[handler_consolehandler]
class=StreamHandler ターミナル上にログを出力する
level=INFO
formatter=sampleformatter
args=(sys.stdout,) 標準出力のログだけ指定できる

[handler_filehandler]
class=FileHandler ファイルにログを出力する
level=ERROR
formatter=sampleformatter
args=['logs/app.log', 'a', 'utf-8'] aにすると追記 wにすると過去のログは破棄

出力先を決める、classにはこれが入ります。

StreamHandler ターミナル上にログを出力する
FileHandler ファイルにログを出力する
RotatingFileHandler ローテーション
TimedRotatingFileHandler 決められた時間でローテーション
SMTPHandler SMTPサーバーにログを格納
HTTPHandler webサーバーに送信

formatter_

sampleformatterの仕様書です
順に、ascii時刻、名前、ログレベル、メッセージ を書き出すようにしています。

[formatter_sampleformatter]
format=%(asctime)s-%(name)s-%(levelname)s-%(message)s

formatterについてはこちらをご覧ください。

logging --- Python 用のログ記録手段 — Python 3.13.1 ドキュメント

ソースコード: Lib/logging/__init__.py Importan…
docs.python.org

参考記事

Pythonにおけるlogging徹底攻略 #Python - Qiita

loggingの重要ポイントルートのloggingを汚さないよう、getLogg…
qiita.com