LoginSignup
1
0

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

Last updated at Posted at 2023-12-22

できること

  • StepFunctionsのMap処理のような、1日の中で複数回起動したAWSサービスのログをまとめて取得することができる。

全体ソースコード

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

メソッド単位の解説

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

  • 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
}

リンク集

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0