CloudWatchのログメッセージをまとめて取得するPythonコード

# できること

- StepFunctionsのMap処理のような、1日の中で複数回起動したAWSサービスのログをまとめて取得することができる。
    - 今回は以下のドキュメントのMap処理を実行したときのtest_invoke_2のprintをlogger.infoに変えたものを取得する。
    - https://qiita.com/komata/items/b25159ff9d9915c64c83
    - 24時間以内のログのみが取得できる。

# 全体ソースコード

```python
import os
import boto3
from logging import getLogger

logger = getLogger(__name__)

def lambda_handler(event, context):

    logger.setLevel(os.getenv("LOG_LEVEL", "INFO"))
    log_group_name = event["LogGroupName"] # CloudWatchのロググループを指定する
    TARGET_DATE    = event["TargetDate"] # YYYYMMDD形式で実行日を指定する
    client         = boto3.client("logs")

    TARGET_DATE = TARGET_DATE[:4] + "/" + TARGET_DATE[4:6] + "/" + TARGET_DATE[6:]

    # ログメッセージを取得するためのログストリームを降順で取得
    log_stream_response = client.describe_log_streams(
        logGroupName = log_group_name,
        descending   = True
    )

    log_streams_list = log_stream_response["logStreams"]

    for log_streams in log_streams_list:
        log_stream_name = log_streams["logStreamName"]

        # 抽出したいログメッセージの年月日と合致するか判定
        if TARGET_DATE in log_stream_name:

            # ログストリームからログメッセージを取得
            log_events_response = client.get_log_events(
                logGroupName  = log_group_name,
                logStreamName = log_stream_name
            )

            # 抽出したいログをカラム位置で指定して取得
            logger.info(str(log_events_response["events"][2]))
```

# 実行結果

- 「count: 3」「count: 21」…と、Mapで複数回起動したLambdaの特定のログをまとめて取得される。
- それぞれのログはJSON形式で取得される。

![get_logs_q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631888/c8f79ee7-e887-e5ee-a846-ea5af21d3c1d.png)

# メソッド単位の解説

### ログストリームを取得するメソッド

- logGroupNameではなくARNを指定して取得する方法もある。
- 「descending   = True」を記載することで新しいログから取得することができる。
    - デフォルトはFalseのため、古いログからの取得になる。

```python
    log_stream_response = client.describe_log_streams(
        logGroupName = log_group_name,
        descending   = True
    )
```

- 実行結果
    - JSON形式で取得される。
    - ログストリームに記載される年月日はUTC(日本時間-9時間)となる仕様です。
    - デフォルトは50件分取得するため、下記実行結果は一部を抜粋したものになります。

```json
{
    'logStreams': [
        {'logStreamName': '2023/11/30/[$LATEST]fc259dd4ca624a5e849090d9e25a78f4', 'creationTime': 1701305853049, 'firstEventTimestamp': 1701305847544, 'lastEventTimestamp': 1701305847658, 'lastIngestionTime': 1701305853057, 'uploadSequenceToken': '49039859569131812743569872153698228335854131385945411954', 'arn': 'arn:aws:logs:ap-northeast-1:657219115014:log-group:/aws/lambda/ats-lmd-func-02:log-stream:2023/11/30/[$LATEST]fc259dd4ca624a5e849090d9e25a78f4', 'storedBytes': 0}, 
        {'logStreamName': '2023/11/30/[$LATEST]dae0ebbea434462d91bfdebb2adee362', 'creationTime': 1701305850743, 'firstEventTimestamp': 1701305847462, 'lastEventTimestamp': 1701305847575, 'lastIngestionTime': 1701305850752, 'uploadSequenceToken': '49039859569131809679699341869467142151505378371852161508', 'arn': 'arn:aws:logs:ap-northeast-1:657219115014:log-group:/aws/lambda/ats-lmd-func-02:log-stream:2023/11/30/[$LATEST]dae0ebbea434462d91bfdebb2adee362', 'storedBytes': 0}, 
        {'logStreamName': '2023/11/30/[$LATEST]8b43cc92b60f4a76aaee5a6f963c3216', 'creationTime': 1701305853828, 'firstEventTimestamp': 1701305847539, 'lastEventTimestamp': 1701305847663, 'lastIngestionTime': 1701305853835, 'uploadSequenceToken': '49039859569131813777709252874362778766896581338569494834', 'arn': 'arn:aws:logs:ap-northeast-1:657219115014:log-group:/aws/lambda/ats-lmd-func-02:log-stream:2023/11/30/[$LATEST]8b43cc92b60f4a76aaee5a6f963c3216', 'storedBytes': 0},
		...
		]
}
```

### ログメッセージを取得するメソッド

- 上記ログストリームの取得と同様に、logGroupNameではなくARNを指定して取得する方法もある。

```python
            log_events_response = client.get_log_events(
                logGroupName  = log_group_name,
                logStreamName = log_stream_name
            )
```

- 実行結果
    - JSON形式で取得される。
    - 以下はログレベルがINFOのログメッセージを取得した場合の取得結果の一つ。

```json
{
    'timestamp': 1701305847573, 
    'message': "[INFO]\t2023-11-30T00:57:27.573Z\t04bf493b-a4bb-4901-b4ec-30ab116c365a\t{'count': '21'}\n", 
    'ingestionTime': 1701305850752
}
```

# リンク集

- ログストリームを出力するメソッド
    - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs/client/describe_log_streams.html
- ログメッセージを出力するメソッド
    - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs/client/get_log_events.html