🦥
Lambda PythonでbasicConfigとprintログから脱却する方法
はじめに
今の職場ではバックエンドにPythonを利用しています
ログはbasicConfigやprint関数を利用しています
エラー調査がしんどいです...
ということから、簡単ですが久しぶりに記事を書くことにしました!
Lambdaでjson形式のログを出力する方法
全てtext形式
デフォルトの状態です
Lambdaを作成し、print関数で標準出力します
import json
def lambda_handler(event, context):
# TODO implement
print("hello")
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Lambdaを実行すると以下のようなログが出力されます

システムログのみjson形式
自動で出力されるLambdaのSTARTやENDログをjson形式にします
コードの修正は不要ですが、Lambdaの設定変更が必要です
-
設定->モニタリングおよび運用ツール->編集

-
ログフォーマットでJSONを選択

Lambdaを実行すると以下のようなログが出力されます

全てjson形式
AWS PowerToolsを使用します
- コードを修正
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.logging.formatter import LambdaPowertoolsFormatter
from aws_lambda_powertools.utilities.typing import LambdaContext
formatter = LambdaPowertoolsFormatter(log_record_order=["timestamp", "level", "location", "message"])
logger = Logger(logger_formatter=formatter)
def lambda_handler(event, context):
# TODO implement
logger.info("hello")
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
レイヤーの追加

-
AWS レイヤーでAWSLambdaPowertoolsPython...を選択

Lambdaを実行すると以下のようなログが出力されます

おわりに
AWS PowerToolsを使用すると location でファイル名や行数が出力されます
basicConfigやprint関数では出力されないため、エラー調査が大変です
以上、ログ出力が技術的な負債の1つとなっている現場からの報告でした...
参考
PowerToolsの詳細については以下をご覧ください
Discussion