在 python 中使用 boto3 查询 cloudwatch 日志中的不同值
query cloudwatch logs for distinct values using boto3 in python
我有一个将指标写入 Cloudwatch
的 lambda 函数。在写入指标的同时,它会在日志组中生成一些日志。
INFO:: username: simran+test@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
INFO:: username: simran+test2@abc.com ClinicID: 7669 nodename: MacBook-Pro-3.local
INFO:: username: simran+test@abc.com ClinicID: 7668 nodename: MacBook-Pro-4.local
INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-5.local
INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
我需要一种有效的方法来获取给定 ClinicId
的 nodename
的 不同值 。例如,我为 ClinicId
传入 7667
,我希望
['MacBook-Pro-2.local', 'MacBook-Pro-5.local']
这是我试过的:
query = "fields @timestamp, @message | parse @message \"username: * ClinicID: * nodename: *\" as username, ClinicID, nodename | filter ClinicID = "+ clinic_id
start_query_response = client.start_query(
logGroupName=log_group,
startTime=int(time.mktime((Util.utcnow() - timedelta(hours=hours)).timetuple())),
endTime=int(time.mktime(Util.utcnow().timetuple())),
queryString=query,
)
我考虑过在 Python 中迭代 start_query_response
,但我不喜欢这个想法。由于我要查看的是超过 7 days
的日志,因此我需要一种有效的方法,而不是必须针对给定的 ClinicID
迭代过去 7 days
的每个日志。
您可以将表达式通过管道传递给 stat
命令并计算每个节点名的出现次数。
将此添加到查询的末尾:
| stats count(*) by nodename
结果将是:
{
'results': [
[
{
'field': 'nodename',
'value': 'MacBook-Pro-2.local\n'
},
{
'field': 'count(*)',
'value': '2'
}
],
[
{
'field': 'nodename',
'value': 'MacBook-Pro-5.local\n'
},
{
'field': 'count(*)',
'value': '1'
}
]
]
}
有关各种命令的更多详细信息,请参阅此处:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
我有一个将指标写入 Cloudwatch
的 lambda 函数。在写入指标的同时,它会在日志组中生成一些日志。
INFO:: username: simran+test@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
INFO:: username: simran+test2@abc.com ClinicID: 7669 nodename: MacBook-Pro-3.local
INFO:: username: simran+test@abc.com ClinicID: 7668 nodename: MacBook-Pro-4.local
INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-5.local
INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
我需要一种有效的方法来获取给定 ClinicId
的 nodename
的 不同值 。例如,我为 ClinicId
传入 7667
,我希望
['MacBook-Pro-2.local', 'MacBook-Pro-5.local']
这是我试过的:
query = "fields @timestamp, @message | parse @message \"username: * ClinicID: * nodename: *\" as username, ClinicID, nodename | filter ClinicID = "+ clinic_id
start_query_response = client.start_query(
logGroupName=log_group,
startTime=int(time.mktime((Util.utcnow() - timedelta(hours=hours)).timetuple())),
endTime=int(time.mktime(Util.utcnow().timetuple())),
queryString=query,
)
我考虑过在 Python 中迭代 start_query_response
,但我不喜欢这个想法。由于我要查看的是超过 7 days
的日志,因此我需要一种有效的方法,而不是必须针对给定的 ClinicID
迭代过去 7 days
的每个日志。
您可以将表达式通过管道传递给 stat
命令并计算每个节点名的出现次数。
将此添加到查询的末尾:
| stats count(*) by nodename
结果将是:
{
'results': [
[
{
'field': 'nodename',
'value': 'MacBook-Pro-2.local\n'
},
{
'field': 'count(*)',
'value': '2'
}
],
[
{
'field': 'nodename',
'value': 'MacBook-Pro-5.local\n'
},
{
'field': 'count(*)',
'value': '1'
}
]
]
}
有关各种命令的更多详细信息,请参阅此处:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html