Python logging ライブラリで出力したログが全て AppServiceConsoleLogs にて Error レベルと記録される
質問
Python ランタイムの Azure Web Apps で診断設定の AppServiceConsoleLogs を有効にすると、 logging ライブラリのログレベルに関わらず、出力しているログが全て Error レベルで記録される。AppServiceConsoleLogs のログレベルを制御することは可能か。
回答
AppServiceConsoleLogs のログレベルは Informational, Error のみとなっておりますので、この2つのレベルに制御することは可能です。AppServiceConsoleLogs は標準出力/標準エラーのログを出力するための機能として設計されおります。このような設計思想より、恐縮ながら logging ライブラリが独自に定義しているログレベル (debug, info, warning, error, critical) でログを分類することは叶いません。ログレベルの情報はログの本文の先頭に付与されますので、logging ライブラリで出力したログのフィルタリングが必要な場合はこちらの情報をご活用ください。(上記画像内の ResultDescription 参照)
全てのログが Error レベルで記録される理由
AppServiceConsoleLogs は 標準出力 (stdout) と標準エラー (stderr) をキャプチャ しており、 標準出力は Informational レベル, 標準エラーは Error レベルと記録いたします。
参考:診断ログの有効化 - Azure App Service
一方で、 Python logging ライブラリは ログ出力先としてファイルパスを指定せず、既定のままとした場合、 StreamHandler が使用され、StreamHandler は既定で 標準エラー (stderr) にログを出力いたします。
参考:https://docs.python.org/3.10/library/logging.html#logging.basicConfig
参考:https://docs.python.org/3.10/library/logging.handlers.html#logging.StreamHandler
そのため、 logging の設定が既定だった場合、ログレベルに依らず全てのログが標準エラーへ出力され、 AppServiceConsoleLogs にて Error レベルと記録されますので、App Service としては想定された正常な動作となります。
Informational レベルでログを記録する方法はありますか?
stream の出力先を標準出力 (stdout) とすることで、logging ログを Informational レベルで記録いただけます。
具体的には、下記コード例のように basicConfig() の引数に stream=sys.stdout と指定することで標準出力にログを出力することが可能となります。
import logging
app = Flask(__name__)
@app.route('/')
def index():
# logging.basicConfig()
logging.basicConfig(stream=sys.stdout)
logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")
logger.debug("debug log")
logger.info("info log")
logger.warning("warning log")
logger.error("error log")
logger.critical("critical log")
print('Request for index page received')
return render_template('index.html')
※標準出力に出力されたログは Informational レベルで AppServiceConsoleLogs に記録される。
本記事が参考になりましたら幸いでございます。
2024 年 05 月 23 日時点の内容となります。
本記事の内容は予告なく変更される場合がございますので予めご了承ください。