FlaskはPythonで開発された軽量なWebフレームワークで、そのシンプルさと拡張性から多くの開発者に利用されています。
今回は、特にAWSのEC2やECSでFlaskを使用している開発者の皆様向けに、ある一般的な問題とその解決策について共有させていただきます。
サーバーのヘルスチェックは重要な部分であり、私たちはそのためのエンドポイント/healthzを定期的にポーリングしています。
しかし、これがもたらすログ出力の多さが問題となり、重要な情報が見づらくなることがあります。
そこで、ヘルスチェックのエンドポイントに関するログだけを無効にする方法について考察しました。
解決策:特定のルートのログ出力をフィルタリングする
この問題に対する答えの一つとして、PythonのloggingモジュールのFilterクラスを用いる方法があります。このクラスを継承し、カスタムフィルタクラスを作成します。このフィルタをロガーに追加することで、特定のログメッセージをフィルタリングできます。
import logging
class HealthCheckFilter(logging.Filter):
def filter(self, record):
return "/healthz" not in record.getMessage()
ここで定義したHealthCheckFilterクラスは、ログメッセージに/healthzが含まれていない場合にのみTrueを返します。
したがって、/healthzがメッセージに含まれるログエントリはフィルタリングされ、出力されません。
そして、このフィルタを適用したいロガーに追加します:
logger = Logger().getLogger('default')
logger.addFilter(HealthCheckFilter())
これにより、ヘルスチェックに関するログ出力が無効化され、ログの可読性が向上します。
注意点
この解決策は、特定のロガーに対してのみ適用されます。全体のロガーへの適用はされません。
例えば、Flaskは内部的にWerkzeugサーバーを利用しており、そのサーバーは自己のロガー(‘werkzeug’)を持っています。
そのため、もしWerkzeugサーバーからのログもフィルタリングしたい場合は、同様にフィルタを追加する必要があります。
この記事がAWSのEC2やECSで大規模なFlaskアプリケーションを運用している皆様の一助になれば幸いです。
特定のエンドポイントのログ出力を制御することで、ログの可読性が向上し、重要な情報へのアクセスが容易になります。
私たちはまだ学び続けており、他の解決策や改善点があれば、ぜひ共有いただければと思います。