できること
- StepFunctionsのMap処理のような、1日の中で複数回起動したAWSサービスのログをまとめて取得することができる。
- 今回は以下のドキュメントのMap処理を実行したときのtest_invoke_2のprintをlogger.infoに変えたものを取得する。
- https://qiita.com/komata/items/b25159ff9d9915c64c83
- 24時間以内のログのみが取得できる。
全体ソースコード
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形式で取得される。
メソッド単位の解説
ログストリームを取得するメソッド
- logGroupNameではなくARNを指定して取得する方法もある。
- 「descending = True」を記載することで新しいログから取得することができる。
- デフォルトはFalseのため、古いログからの取得になる。
log_stream_response = client.describe_log_streams(
logGroupName = log_group_name,
descending = True
)
- 実行結果
- JSON形式で取得される。
- ログストリームに記載される年月日はUTC(日本時間-9時間)となる仕様です。
- デフォルトは50件分取得するため、下記実行結果は一部を抜粋したものになります。
{
'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を指定して取得する方法もある。
log_events_response = client.get_log_events(
logGroupName = log_group_name,
logStreamName = log_stream_name
)
- 実行結果
- JSON形式で取得される。
- 以下はログレベルがINFOのログメッセージを取得した場合の取得結果の一つ。
{
'timestamp': 1701305847573,
'message': "[INFO]\t2023-11-30T00:57:27.573Z\t04bf493b-a4bb-4901-b4ec-30ab116c365a\t{'count': '21'}\n",
'ingestionTime': 1701305850752
}