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時間の間のいずれかになります。
例:
ClinicID=7667
または
ClinicID=7667
およびusername='[email protected]'
または
username='[email protected]'
Pythonではboto3
を使用しています。これについて教えてもらえますか?
CloudWatch Logs Insightsを使用して、必要なものを取得できます。
start_query
およびget_query_results
APIを使用します: 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'
}
]
]
}
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
どうなるか教えてください。
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