Flaskのログ出力と可観測性を完全解説!初心者でもわかるlogger(ロギング)の基本
生徒
「Flaskで作ったWebアプリが、たまに動かなくなるんです。でも、どこで何が起きたのかさっぱり分からなくて……。」
先生
「それは困りましたね。プログラムの内部で何が起きているかを記録する『ログ』という仕組みを導入してみましょう。Flaskには標準でログを出力する機能が備わっているんですよ。」
生徒
「ログって、日記みたいなものですか?どうやって使うのか教えてください!」
先生
「その通り、アプリの日記のようなものです!それでは、Flaskでのログの出し方を基礎から学んでいきましょう!」
1. ログ(Log)とロギング(Logging)とは?
プログラミングの世界では、プログラムが動いているときに出す「記録」のことをログ(Log)と呼びます。そして、その記録を取る行為や仕組みのことをロギング(Logging)と言います。
パソコンを初めて触る方にとって「記録」と言われてもピンとこないかもしれません。例えば、銀行の通帳をイメージしてみてください。いつ、誰が、いくらお金を出し入れしたかが一目で分かりますよね?Webアプリにおけるログも同じで、「いつ、誰がアクセスして、エラーが起きたかどうか」を後から確認するための大切な証拠になります。
ログがあれば、もしアプリが止まってしまっても、「あ、ここで計算を間違えたんだな」とか「このデータが足りなかったんだな」という原因(バグと言います)を突き止めることができるのです。
2. Flaskにおける標準ログ機能の仕組み
Pythonの人気WebフレームワークであるFlaskには、最初からログを出力するための道具が用意されています。これはPythonそのものに備わっているloggingというモジュール(便利な道具箱のようなもの)をベースにしています。
Flaskアプリを立ち上げると、実は自動的にapp.loggerという名前の記録係が作成されます。私たちはこの記録係にお願いするだけで、簡単に画面やファイルにメッセージを残すことができるのです。
難しい設定をしなくても、すぐに使い始められるのがFlaskの魅力の一つです。まずは、最もシンプルなログの出力方法をコードで見てみましょう。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
# app.loggerを使ってログを出力する
app.logger.info('トップページにアクセスされました!')
return 'こんにちは!ログを確認してみてね。'
if __name__ == '__main__':
app.run(debug=True)
3. ログの重要度(ログレベル)を理解しよう
ログには「重要度」というランクがあります。これをログレベルと呼びます。何でもかんでも同じように記録すると、本当に大事な情報が埋もれてしまうからです。
主なログレベルは、低い順に以下のようになっています:
| レベル名 | 意味 | 使いどころ |
|---|---|---|
| DEBUG(デバッグ) | 細かい動作記録 | 開発中に詳しく調べたいとき |
| INFO(インフォ) | 通常の動作記録 | 「ログインした」「ページを開いた」など |
| WARNING(警告) | 注意が必要な状態 | 「設定が古いですよ」など |
| ERROR(エラー) | 問題が発生した状態 | 「エラーで処理が止まった」とき |
| CRITICAL(致命的) | 深刻な状態 | 「システム全体がダウンした」とき |
例えば、普通の挨拶は「INFO」ですが、火事の知らせは「CRITICAL」といった使い分けをします。
4. 様々なレベルでログを出力するコード例
それでは、先ほどのレベルを使い分けた具体的な書き方を見てみましょう。それぞれのレベルに合わせてメソッド(命令)の名前が変わります。
from flask import Flask
app = Flask(__name__)
@app.route('/test-log')
def test_log():
# 状況に合わせて使い分ける
app.logger.debug('これはデバッグ用の細かい情報です')
app.logger.info('これは通常の動作記録です')
app.logger.warning('おっと、何か注意が必要かもしれません')
app.logger.error('大変だ!エラーが発生しました')
app.logger.critical('システムが非常に危険な状態です!')
return '色々な種類のログを出力したよ!'
if __name__ == '__main__':
app.run(debug=True)
このコードを実行してブラウザでアクセスすると、パソコンの黒い画面(コンソールやターミナルと言います)にメッセージが表示されます。これが「ログが出ている」状態です。
[INFO] in app: これは通常の動作記録です
[WARNING] in app: おっと、何か注意が必要かもしれません
[ERROR] in app: 大変だ!エラーが発生しました
[CRITICAL] in app: システムが非常に危険な状態です!
5. 可観測性(オブザーバビリティ)って何?
最近のWeb開発では可観測性(オブザーバビリティ)という言葉がよく使われます。少し難しい言葉ですが、簡単に言うと「外から見て、中がどうなっているか手に取るように分かる状態」のことです。
例えば、お医者さんが患者さんの顔色を見たり、体温を測ったり、聴診器で心音を聞いたりして健康状態を把握しますよね?アプリも同じで、ログや動作速度などのデータを集めることで、「今のアプリは健康かな?」「どこか調子が悪くないかな?」と診断できるようにしておくことが大切なのです。
ロギングは、この可観測性を高めるための第一歩となります。ログがしっかり残っていれば、何かトラブルが起きたときでも「暗闇を手探りで進む」のではなく、「ライトで照らしながら修理する」ことができるようになります。
6. ログをファイルに保存してみよう
これまでの例では、ログは画面に表示されるだけでした。しかし、アプリを24時間動かし続ける場合、画面をずっと見ているわけにはいきません。そこで、ログをファイルとして保存する方法が一般的です。
ファイルに保存しておけば、一晩中起きた出来事を翌朝ゆっくり確認することができます。Pythonのlogging設定を使って、Flaskのログをファイルに書き出す設定を追加してみましょう。
import logging
from flask import Flask
app = Flask(__name__)
# ログの設定を行う(ファイル名や記録するレベルを決める)
logging.basicConfig(filename='app.log', level=logging.DEBUG)
@app.route('/hello')
def hello():
app.logger.info('ファイルへの書き込みテストです')
return 'app.logというファイルを確認してみてね!'
if __name__ == '__main__':
app.run()
このコードを実行すると、プログラムと同じフォルダに「app.log」という名前のテキストファイルができあがります。その中身を開くと、記録されたログがずらっと並んでいるはずです。
7. 初心者が気をつけるべきロギングのコツ
ログを出すときに、やってはいけないことがいくつかあります。特に「個人情報」の扱いです。パスワードやクレジットカード番号、住所などは、絶対にログに出力してはいけません。
ログファイルは管理者が見るものですが、万が一ファイルが盗まれたときに、大切な情報がそのまま書かれていると大変なことになります。「誰がアクセスしたか(ユーザーIDなど)」は記録しても良いですが、「秘密の情報」は書かない、というのが鉄則です。
また、何でもかんでもINFOレベルで出すと、ログファイルが巨大になりすぎてハードディスク(パソコンの記憶容量)を使い切ってしまうこともあります。意味のある情報を、適切なレベルで出す練習をしていきましょう。
8. 実際にエラーが起きた時のログの見方
実際にエラーが起きたとき、ログには「トレースバック(Traceback)」と呼ばれる情報が表示されます。これは、エラーが起きるまでのプログラムの実行ルートを逆戻りした記録です。
最初は暗号のように見えるかもしれませんが、一番下の行に「何が起きたか(ZeroDivisionError: division by zero など)」が書いてあり、その少し上に「どのファイルの何行目で起きたか」が書いてあります。そこを読み解くのが、プログラミング上達の近道です。
from flask import Flask
app = Flask(__name__)
@app.route('/error')
def cause_error():
# 0で割り算をするとエラーが発生する
try:
result = 10 / 0
except Exception as e:
# エラーの内容をログに記録する
app.logger.error(f'予期しないエラーが発生!: {e}')
return 'ごめんなさい、エラーが起きました。'
if __name__ == '__main__':
app.run(debug=True)
このように、try-except(トライ・エクセプト)という構文と組み合わせることで、エラーの内容を冷静にログに残しつつ、ユーザーには丁寧な案内を出すことができるようになります。これが、プロが作るWebアプリの基本なのです。