

# JSON とプレーンテキストのログフォーマットの設定
<a name="monitoring-cloudwatchlogs-logformat"></a>

ログ出力を JSON キー値のペアとしてキャプチャすると、関数のデバッグ時の検索やフィルタリングが容易になります。JSON 形式のログでは、タグやコンテキスト情報をログに追加することもできます。これにより、大量のログデータを自動的に分析するのに役立ちます。開発ワークフローがプレーンテキストで Lambda ログを使用する既存のツールに依存している場合を除き、ログ形式には JSON を選択することをお勧めします。

**Lambda マネージドインスタンス**  
Lambda マネージドインスタンスは JSON ログ形式のみをサポートします。マネージドインスタンス関数を作成すると、Lambda は自動的にログ形式を JSON に設定し、プレーンテキストに変更することはできません。マネージドインスタンスの詳細については、「[Lambda マネージドインスタンス](lambda-managed-instances.md)」を参照してください。

すべての Lambda マネージドランタイムについて、関数のシステムログを CloudWatch Logs に非構造化プレーンテキストで送信するか、JSON 形式で送信するかを選択できます。システムログは Lambda が生成するログで、プラットフォームイベントログと呼ばれることもあります。

[サポートされているランタイム](#monitoring-cloudwatchlogs-logformat-supported)では、サポートされている組み込みログ記録メソッドのいずれかを使用すると、Lambda は関数のアプリケーションログ (関数コードが生成するログ) を構造化された JSON 形式で出力することもできます。これらのランタイムに対して関数のログ形式を設定すると、選択した設定がシステムログとアプリケーションログの両方に適用されます。

サポートされているランタイムでは、関数がサポートされているログ記録ライブラリまたはメソッドを使用している場合は、Lambda が構造化された JSON でログをキャプチャするために既存のコードを変更する必要はありません。

**注記**  
JSON ログフォーマットを使用すると、メタデータが追加され、一連のキー値のペアを含む JSON オブジェクトとしてログメッセージがエンコードされます。そのため、関数のログメッセージのサイズが大きくなる可能性があります。

## サポートされているランタイムとログ記録メソッド
<a name="monitoring-cloudwatchlogs-logformat-supported"></a>

 Lambda は現在、以下のランタイムの JSON 構造化アプリケーションログを出力するオプションをサポートしています。


| Language | サポートバージョン | 
| --- | --- | 
| Java | Amazon Linux 1 上の Java 8 を除くすべての Java ランタイム | 
| .NET | .NET 8 以降 | 
| Node.js | Node.js 16 およびそれ以降 | 
| Python | Python 3.8 以降 | 
| Rust | 該当なし | 

Lambda が関数のアプリケーションログを構造化された JSON 形式で CloudWatch に送信するには、関数が以下の組み込みログ記録ツールを使用してログを出力する必要があります。
+ **Java**: `LambdaLogger` ロガーまたは Log4j2。詳細については、「[Java Lambda 関数のログ記録とモニタリング](java-logging.md)」を参照してください。
+ **.NET**: コンテキストオブジェクトの `ILambdaLogger` インスタンス。詳細については、「[C\$1 Lambda 関数のログ記録とモニタリング](csharp-logging.md)」を参照してください。
+ **Node.js** – コンソールメソッド `console.trace`、`console.debug`、`console.log`、`console.info`、`console.error` および `console.warn`。詳細については、「[Node.js Lambda 関数のログ記録とモニタリング](nodejs-logging.md)」を参照してください。
+ **Python**: 標準の Python `logging` ライブラリ。詳細については、「[Python Lambda 関数のログ記録とモニタリング](python-logging.md)」を参照してください。
+ **Rust**: `tracing` クレート。詳細については、「[Rust Lambda 関数のログ記録とモニタリング](rust-logging.md)」を参照してください。

他のマネージド Lambda ランタイムについては、現在、Lambda は構造化された JSON 形式でのシステムログのキャプチャのみをネイティブでサポートしています。ただし、Powertools for AWS Lambda などのログ記録ツールを使用して JSON 形式のログを出力することで、どのランタイムでも構造化 JSON 形式のアプリケーションログをキャプチャできます。

## 既定のログ形式
<a name="monitoring-cloudwatchlogs-format-default"></a>

現在、すべての Lambda ランタイムのデフォルトのログ形式はプレーンテキストです。Lambda マネージドインスタンスの場合、ログ形式は常に JSON であり、変更できません。

既に Powertools for AWS Lambda などのログ記録ライブラリを使用して JSON 構造化形式で関数ログを生成している場合は、JSON ログ形式を選択すればコードを変更する必要はありません。Lambda は既に JSON でエンコードされたログを二重にエンコードしないため、関数のアプリケーションログは以前と同様にキャプチャされます。

## システムログの JSON 形式
<a name="monitoring-cloudwatchlogs-JSON-system"></a>

関数のログ形式を JSON として設定すると、各システムログ項目 (プラットフォームイベント) は、以下のキーを含むキー値のペアを含む JSON オブジェクトとしてキャプチャされます。
+ `"time"` - ログメッセージが生成された時刻
+ `"type"` - 記録されるイベントのタイプ
+ `"record"` - ログ出力の内容

`"record"` 値の形式は、記録されるイベントのタイプによって異なります。詳細については、「[Telemetry API `Event` オブジェクトタイプ](telemetry-schema-reference.md#telemetry-api-events)」を参照してください。システムログイベントに割り当てられるログレベルの詳細については、「[システムログレベルのイベントマッピング](monitoring-cloudwatchlogs-log-level.md#monitoring-cloudwatchlogs-log-level-mapping)」を参照してください。

比較のため、以下の 2 つの例は、プレーンテキスト形式と構造化された JSON 形式の両方で同じログ出力を示しています。ほとんどの場合、システムログイベントには、プレーンテキストで出力される場合よりも JSON 形式で出力される方が多くの情報が含まれることに注意してください。

**Example プレーンテキスト:**  

```
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
```

**Example 構造化された 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 を使用して拡張機能のリアルタイムテレメトリデータにアクセスする](telemetry-api.md) は常に JSON 形式で `START` や `REPORT` などのプラットフォームイベントを送信します。Lambda が CloudWatch に送信するシステムログの形式を設定しても、Lambda Telemetry API の動作には影響しません。

## アプリケーションログの JSON 形式
<a name="monitoring-cloudwatchlogs-JSON-application"></a>

関数のログ形式を 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 関数のログ記録とモニタリング](python-logging.md)、[Node.js Lambda 関数のログ記録とモニタリング](nodejs-logging.md)、[Java Lambda 関数のログ記録とモニタリング](java-logging.md)」を参照してください。

**注記**  
Lambda がタイムスタンプ値に使用するキーは、システムログとアプリケーションログでは異なります。システムログの場合、Lambda はキー `"time"` を使用して Telemetry API との一貫性を維持します。アプリケーションログについては、Lambda はサポートされているランタイムの規則に従い、`"timestamp"` を使用します。

比較のため、以下の 2 つの例は、プレーンテキスト形式と構造化された JSON 形式の両方で同じログ出力を示しています。

**Example プレーンテキスト:**  

```
2024-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
```

**Example 構造化された JSON:**  

```
{
    "timestamp":"2024-10-27T19:17:45.586Z",
    "level":"INFO",
    "message":"some log message",
    "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189"
}
```

## 関数のログ形式の設定
<a name="monitoring-cloudwatchlogs-set-format"></a>

関数のログ形式を設定するには、Lambda コンソールまたは AWS Command Line Interface (AWS CLI) を使用できます。[CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html) と [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) Lambda API コマンド、AWS Serverless Application Model (AWS SAM) [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) リソース、および CloudFormation [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html) リソースを使用して、関数のログ形式を設定することもできます。

関数のログ形式を変更しても、CloudWatch Logs に保存されている既存のログには影響しません。新しいログのみが更新された形式を使用します。

関数のログ形式を JSON に変更し、ログレベルを設定しない場合、Lambda は関数のアプリケーションログレベルとシステムログレベルを自動的に INFO に設定します。つまり、Lambda はレベル INFO 以下のログ出力のみを CloudWatch Logs に送信します。アプリケーションおよびシステムログレベルのフィルタリングの詳細については、[ログレベルのフィルタリング](monitoring-cloudwatchlogs-log-level.md) を参照してください。

**注記**  
Python ランタイムでは、関数のログ形式がプレーンテキストに設定されている場合、デフォルトのログレベル設定は WARN です。つまり、Lambda は WARN 以下のレベルのログ出力のみを CloudWatch Logs に送信します。関数のログ形式を JSON に変更すると、このデフォルト動作が変わります。Python におけるログ記録の詳細については、「[Python Lambda 関数のログ記録とモニタリング](python-logging.md)」を参照してください。

埋め込みメトリックフォーマット (EMF、Embedded Metric Format) ログを生成する Node.js 関数の場合、関数のログ形式を JSON に変更すると、CloudWatch がメトリクスを認識できなくなる可能性があります。

**重要**  
関数が Powertools for AWS Lambda (TypeScript) またはオープンソースの EMF クライアントライブラリを使用して EMF ログを生成する場合は、[Powertools](https://github.com/aws-powertools/powertools-lambda-typescript) および [EMF](https://www.npmjs.com/package/aws-embedded-metrics) ライブラリを最新バージョンに更新して、CloudWatch が引き続きログを正しく解析できるようにしてください。JSON ログ形式に切り替える場合は、関数に埋め込まれているメトリクスとの互換性を確認するためのテストを実施することもお勧めします。EMF ログを生成する node.js 関数に関するその他のアドバイスについては、「[構造化された JSON ログでの埋め込みメトリクスフォーマット (EMF、Embedded Metric Format) クライアントライブラリの使用](nodejs-logging.md#nodejs-logging-advanced-emf)」を参照してください。

**関数のログ形式を設定するには (コンソール)**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. 関数を選択します。

1. 関数設定ページで、**[モニタリングおよび運用ツール]** を選択します。

1. **[ログ記録設定]** ペインで、**[編集]** を選択します。

1. **[ログの内容]** の **[ログ形式]** で **[テキスト]** または **[JSON]** を選択します。

1. **[保存]** を選択します。

**既存の関数 (AWS CLI) のログ形式を変更するには**
+ 既存の関数のログ形式を変更するには、[update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) コマンドを使用します。`LoggingConfig` の `LogFormat` オプションを `JSON` または `Text` に設定します。

  ```
  aws lambda update-function-configuration \
    --function-name myFunction \
    --logging-config LogFormat=JSON
  ```

**関数の作成時にログ形式を設定するには (AWS CLI)**
+ 新しい関数を作成するときにログ形式を設定するには、[create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) コマンドの `--logging-config` オプションを使用します。`LogFormat` を `JSON` または `Text` に設定します。以下のコマンド例を使用すれば、構造化 JSON でログを出力する Node.js 関数を作成できます。

  関数の作成時にログ形式を指定しない場合、Lambda は選択したランタイムバージョンのデフォルトのログ形式を使用します。デフォルトのログ記録形式の詳細については、「[既定のログ形式](#monitoring-cloudwatchlogs-format-default)」を参照してください。

  ```
  aws lambda create-function \ 
    --function-name myFunction \ 
    --runtime nodejs24.x \
    --handler index.handler \
    --zip-file fileb://function.zip \
    --role arn:aws:iam::123456789012:role/LambdaRole \
    --logging-config LogFormat=JSON
  ```