web-dev-qa-db-ja.com

pythonでboto3を使用してcloudwatchログをクエリする方法

Cloudwatchにメトリックを書き込むラムダ関数があります。メトリックを書き込みながら、ロググループにいくつかのログを生成します。

INFO:: username: [email protected] ClinicID: 7667 nodename: MacBook-Pro-2.local

INFO:: username: [email protected] ClinicID: 7667 nodename: MacBook-Pro-2.local

INFO:: username: [email protected] ClinicID: 7668 nodename: MacBook-Pro-2.local

INFO:: username: [email protected] ClinicID: 7667 nodename: MacBook-Pro-2.local

AWSのログを過去x時間にクエリしたいと思います。ここで、xは、任意のパラメーターに基づいて、12〜24時間の間のいずれかになります。

例:

  1. 過去5時間のCloudwatchログにクエリを実行するClinicID=7667

または

  1. 過去5時間のCloudwatchログにクエリを実行します。ここで、ClinicID=7667およびusername='[email protected]'

または

  1. 過去5時間のCloudwatchログにクエリを実行するusername='[email protected]'

Pythonではboto3を使用しています。これについて教えてもらえますか?

3
Simran kaur

CloudWatch Logs Insightsを使用して、必要なものを取得できます。

start_queryおよびget_query_results AP​​Iを使用します: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html

使用するクエリを開始するには(質問のユースケース2の場合、1と3は似ています):

import boto3
from datetime import datetime, timedelta
import time

client = boto3.client('logs')

query = "fields @timestamp, @message | parse @message \"username: * ClinicID: * nodename: *\" as username, ClinicID, nodename | filter ClinicID = 7667 and username='[email protected]'"  

log_group = '/aws/lambda/NAME_OF_YOUR_LAMBDA_FUNCTION'

start_query_response = client.start_query(
    logGroupName=log_group,
    startTime=int((datetime.today() - timedelta(hours=5)).timestamp()),
    endTime=int(datetime.now().timestamp()),
    queryString=query,
)

query_id = start_query_response['queryId']

response = None

while response == None or response['status'] == 'Running':
    print('Waiting for query to complete ...')
    time.sleep(1)
    response = client.get_query_results(
        queryId=query_id
    )

応答には、この形式のデータ(およびいくつかのメタデータ)が含まれます。

{
  'results': [
    [
      {
        'field': '@timestamp',
        'value': '2019-12-09 17:07:24.428'
      },
      {
        'field': '@message',
        'value': 'username: [email protected] ClinicID: 7667 nodename: MacBook-Pro-2.local\n'
      },
      {
        'field': 'username',
        'value': '[email protected]'
      },
      {
        'field': 'ClinicID',
        'value': '7667'
      },
      {
        'field': 'nodename',
        'value': 'MacBook-Pro-2.local\n'
      }
    ]
  ]
}
5
Dejan Peretin

cloudWatchlogs client と少しのコーディングでこれを実現できます。また、条件をカスタマイズしたり、JSONモジュールを使用して正確な結果を得ることができます。

編集

describe_log_streams を使用してストリームを取得できます。最新のものだけが必要な場合は、制限1を設定するか、複数のストリームが必要な場合は、forループを使用して、下記のようにフィルタリングしながらすべてのストリームを反復します。

    import boto3

    client = boto3.client('logs')


    ## For the latest
    stream_response = client.describe_log_streams(
        logGroupName="/aws/lambda/lambdaFnName", # Can be dynamic
        orderBy='LastEventTime',                 # For the latest events
        limit=1                                  # the last latest event, if you just want one
        )

    latestlogStreamName = stream_response["logStreams"]["logStreamName"]


    response = client.get_log_events(
        logGroupName="/aws/lambda/lambdaFnName",
        logStreamName=latestlogStreamName,
        startTime=12345678,
        endTime=12345678,
    )

    for event in response["events"]:
        if event["message"]["ClinicID"] == "7667":
            print(event["message"])
        Elif event["message"]["username"] == "[email protected]":
            print(event["message"])
        #.
        #.
        # more if or else conditions

    ## For more than one Streams, e.g. latest 5
    stream_response = client.describe_log_streams(
        logGroupName="/aws/lambda/lambdaFnName", # Can be dynamic
        orderBy='LastEventTime',                 # For the latest events
        limit=5                                  
        )

    for log_stream in stream_response["logStreams"]:
        latestlogStreamName = log_stream["logStreamName"]

        response = client.get_log_events(
             logGroupName="/aws/lambda/lambdaFnName",
             logStreamName=latestlogStreamName,
             startTime=12345678,
             endTime=12345678,
        )
        ## For example, you want to search "ClinicID=7667", can be dynamic

        for event in response["events"]:
           if event["message"]["ClinicID"] == "7667":
             print(event["message"])
           Elif event["message"]["username"] == "[email protected]":
             print(event["message"])
           #.
           #.
           # more if or else conditions



どうなるか教えてください。

2
Sanny Patel

awslogsを使用しました。インストールすればできます。 --watchは新しいログを追跡します。

awslogs get /aws/lambda/log-group-1 --start="5h ago" --watch

pip install awslogsを使用してインストールできます

あなたが行うことができるフィルタリングするには:

awslogs get /aws/lambda/log-group-1 --filter-pattern '"ClinicID=7667"' --start "5h ago" --timestamp

複数のフィルターパターンもサポートしています。

awslogs get /aws/lambda/log-group-1 --filter-pattern '"ClinicID=7667"' --filter-pattern '" [email protected]"' --start "5h ago" --timestamp

0
Arun K