JSON とプレーンテキストのログフォーマットの設定
ログ出力を JSON キー値のペアとしてキャプチャすると、関数のデバッグ時の検索やフィルタリングが容易になります。JSON 形式のログでは、タグやコンテキスト情報をログに追加することもできます。これにより、大量のログデータを自動的に分析するのに役立ちます。開発ワークフローがプレーンテキストで Lambda ログを使用する既存のツールに依存している場合を除き、ログ形式には JSON を選択することをお勧めします。
すべての Lambda マネージドランタイムについて、関数のシステムログを CloudWatch Logs に非構造化プレーンテキストで送信するか、JSON 形式で送信するかを選択できます。システムログは Lambda が生成するログで、プラットフォームイベントログと呼ばれることもあります。
サポートされているランタイムでは、サポートされている組み込みログ記録メソッドのいずれかを使用すると、Lambda は関数のアプリケーションログ (関数コードが生成するログ) を構造化された JSON 形式で出力することもできます。これらのランタイムに対して関数のログ形式を設定すると、選択した設定がシステムログとアプリケーションログの両方に適用されます。
サポートされているランタイムでは、関数がサポートされているログ記録ライブラリまたはメソッドを使用している場合は、Lambda が構造化された JSON でログをキャプチャするために既存のコードを変更する必要はありません。
注記
JSON ログフォーマットを使用すると、メタデータが追加され、一連のキー値のペアを含む JSON オブジェクトとしてログメッセージがエンコードされます。そのため、関数のログメッセージのサイズが大きくなる可能性があります。
サポートされているランタイムとログ記録メソッド
Lambda は現在、以下のランタイムの JSON 構造化アプリケーションログを出力するオプションをサポートしています。
ランタイム | サポートバージョン |
---|---|
Java | Amazon Linux 1 上の Java 8 を除くすべての Java ランタイム |
.NET | .NET 8 |
Node.js | Node.js 16 およびそれ以降 |
Python | Python 3.8 以降 |
Lambda が関数のアプリケーションログを構造化された JSON 形式で CloudWatch に送信するには、関数が以下の組み込みログ記録ツールを使用してログを出力する必要があります。
-
Java -
LambdaLogger
ロガーまたは Log4j2。 -
.NET - コンテキストオブジェクトの
ILambdaLogger
インスタンス。 -
Node.js - コンソールメソッド
console.trace
、console.debug
、console.log
、console.info
、console.error
およびconsole.warn
-
Python - 標準の Python
logging
ライブラリ
サポートされているランタイムで高度なログ記録コントロールを使用する方法の詳細については、「Java Lambda 関数のログ記録とモニタリング」、「Node.js Lambda 関数のログ記録とモニタリング」および「Python Lambda 関数のログ記録とモニタリング」を参照してください。
他のマネージド Lambda ランタイムについては、現在、Lambda は構造化された JSON 形式でのシステムログのキャプチャのみをネイティブでサポートしています。ただし、Powertools for AWS Lambda などのログ記録ツールを使用して JSON 形式のログを出力することで、どのランタイムでも構造化 JSON 形式のアプリケーションログをキャプチャできます。
既定のログ形式
現在、すべての Lambda ランタイムのデフォルトのログ形式はプレーンテキストです。
既に Powertools for AWS Lambda などのログ記録ライブラリを使用して JSON 構造化形式で関数ログを生成している場合は、JSON ログ形式を選択すればコードを変更する必要はありません。Lambda は既に JSON でエンコードされたログを二重にエンコードしないため、関数のアプリケーションログは以前と同様にキャプチャされます。
システムログの JSON 形式
関数のログ形式を JSON として設定すると、各システムログ項目 (プラットフォームイベント) は、以下のキーを含むキー値のペアを含む JSON オブジェクトとしてキャプチャされます。
-
"time"
- ログメッセージが生成された時刻 -
"type"
- 記録されるイベントのタイプ -
"record"
- ログ出力の内容
"record"
値の形式は、記録されるイベントのタイプによって異なります。詳細については、「Telemetry API Event オブジェクトタイプ」を参照してください。システムログイベントに割り当てられるログレベルの詳細については、「システムログレベルのイベントマッピング」を参照してください。
比較のため、以下の 2 つの例は、プレーンテキスト形式と構造化された JSON 形式の両方で同じログ出力を示しています。ほとんどの場合、システムログイベントには、プレーンテキストで出力される場合よりも JSON 形式で出力される方が多くの情報が含まれることに注意してください。
例 プレーンテキスト:
2024-03-13 18:56:24.046000 fbe8c1 INIT_START Runtime Version: python:3.12.v18 Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
例 構造化された JSON:
{
"time": "2024-03-13T18:56:24.046Z",
"type": "platform.initStart",
"record": {
"initializationType": "on-demand",
"phase": "init",
"runtimeVersion": "python:3.12.v18",
"runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0"
}
}
注記
Telemetry API を使用して拡張機能のリアルタイムテレメトリデータにアクセスする は常に JSON 形式で START
や REPORT
などのプラットフォームイベントを送信します。Lambda が CloudWatch に送信するシステムログの形式を設定しても、Lambda Telemetry API の動作には影響しません。
アプリケーションログの JSON 形式
関数のログ形式を JSON として設定すると、サポートされているログ記録ライブラリとメソッドを使用して書き込まれたアプリケーションログ出力は、以下のキーを持つキー値のペアを含む JSON オブジェクトとしてキャプチャされます。
-
"timestamp"
- ログメッセージが生成された時刻 -
"level"
- メッセージに割り当てられたログレベル -
"message"
- ログメッセージの内容 -
"requestId"
(Python、.NET、および Node.js) または"AWSrequestId"
(Java) - 関数呼び出しの一意のリクエスト ID
関数が使用するランタイムとログ記録方法によっては、この JSON オブジェクトには追加のキーペアが含まれる場合もあります。例えば、Node.js では、関数が console
メソッドを使用して複数の引数を使用しているエラーオブジェクトをログに記録する場合、JSON オブジェクトには、errorMessage
、errorType
、stackTrace
というキーを含む追加のキーと値のペアが含まれます。さまざまな Lambda ランタイムの JSON 形式のログの詳細については、「Python Lambda 関数のログ記録とモニタリング、Node.js Lambda 関数のログ記録とモニタリング、Java Lambda 関数のログ記録とモニタリング」を参照してください。
注記
Lambda がタイムスタンプ値に使用するキーは、システムログとアプリケーションログでは異なります。システムログの場合、Lambda はキー "time"
を使用して Telemetry API との一貫性を維持します。アプリケーションログについては、Lambda はサポートされているランタイムの規則に従い、"timestamp"
を使用します。
比較のため、以下の 2 つの例は、プレーンテキスト形式と構造化された JSON 形式の両方で同じログ出力を示しています。
例 プレーンテキスト:
2024-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
例 構造化された JSON:
{
"timestamp":"2024-10-27T19:17:45.586Z",
"level":"INFO",
"message":"some log message",
"requestId":"79b4f56e-95b1-4643-9700-2807f4e68189"
}
関数のログ形式の設定
関数のログ形式を設定するには、Lambda コンソールまたは AWS Command Line Interface (AWS CLI) を使用できます。CreateFunction と UpdateFunctionConfiguration Lambda API コマンド、AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function リソース、および AWS CloudFormation AWS::Lambda::Function リソースを使用して、関数のログ形式を設定することもできます。
関数のログ形式を変更しても、CloudWatch Logs に保存されている既存のログには影響しません。新しいログのみが更新された形式を使用します。
関数のログ形式を JSON に変更し、ログレベルを設定しない場合、Lambda は関数のアプリケーションログレベルとシステムログレベルを自動的に INFO に設定します。つまり、Lambda はレベル INFO 以下のログ出力のみを CloudWatch Logs に送信します。アプリケーションおよびシステムログレベルのフィルタリングの詳細については、ログレベルのフィルタリング を参照してください。
注記
Python ランタイムでは、関数のログ形式がプレーンテキストに設定されている場合、デフォルトのログレベル設定は WARN です。つまり、Lambda は WARN 以下のレベルのログ出力のみを CloudWatch Logs に送信します。関数のログ形式を JSON に変更すると、このデフォルト動作が変わります。Python におけるログ記録の詳細については、「Python Lambda 関数のログ記録とモニタリング」を参照してください。
埋め込みメトリックフォーマット (EMF、Embedded Metric Format) ログを生成する Node.js 関数の場合、関数のログ形式を JSON に変更すると、CloudWatch がメトリクスを認識できなくなる可能性があります。
重要
関数が Powertools for AWS Lambda (TypeScript) またはオープンソースの EMF クライアントライブラリを使用して EMF ログを生成する場合は、Powertools
関数のログ形式を設定するには (コンソール)
Lambda コンソールの [関数]
ページを開きます。 -
関数を選択します。
-
関数設定ページで、[モニタリングおよび運用ツール] を選択します。
-
[ログ記録設定] ペインで、[編集] を選択します。
-
[ログの内容] の [ログ形式] で [テキスト] または [JSON] を選択します。
-
[保存] を選択します。
既存の関数 (AWS CLI) のログ形式を変更するには
-
既存の関数のログ形式を変更するには、update-function-configuration
コマンドを使用します。 LoggingConfig
のLogFormat
オプションをJSON
またはText
に設定します。aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogFormat=JSON
関数の作成時にログ形式を設定するには (AWS CLI)
-
新しい関数を作成するときにログ形式を設定するには、create-function
コマンドの --logging-config
オプションを使用します。LogFormat
をJSON
またはText
に設定します。以下のコマンド例を使用すれば、構造化 JSON でログを出力する Node.js 関数を作成できます。関数の作成時にログ形式を指定しない場合、Lambda は選択したランタイムバージョンのデフォルトのログ形式を使用します。デフォルトのログ記録形式の詳細については、「既定のログ形式」を参照してください。
aws lambda create-function \ --function-name myFunction \ --runtime nodejs22.x \ --handler index.handler \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole \ --logging-config LogFormat=JSON