如何在python中使用boto3查询cloudwatch日志
我有一个lambda函数,它将度量写入Cloudwatch。在编写度量的同时,它在日志组中生成一些日志如何在python中使用boto3查询cloudwatch日志,python,amazon-web-services,aws-lambda,boto3,amazon-cloudwatch,Python,Amazon Web Services,Aws Lambda,Boto3,Amazon Cloudwatch,我有一个lambda函数,它将度量写入Cloudwatch。在编写度量的同时,它在日志组中生成一些日志 INFO:: username: simran+test@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local INFO:: username: simran+test2@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local INFO:: username: simran+test@ab
INFO:: username: simran+test@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
INFO:: username: simran+test2@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
INFO:: username: simran+test@abc.com ClinicID: 7668 nodename: MacBook-Pro-2.local
INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
我想查询过去x
小时内的AWS日志,根据任何参数,x可能在12到24小时之间的任何地方
例如:
ClinicID=7667
ClinicID=7667
和username='simran+test@abc.com“
username='simran+test@abc.com“
我正在Python中使用
boto3
。请告诉我这方面的方向好吗?我用了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 '" username=simran+test@abc.com"' --start "5h ago" --timestamp
参考资料:
您可以通过和少量编码来实现这一点。您还可以自定义条件或使用JSON模块获得精确的结果 编辑 您可以使用来获取流。如果您只需要最新的,只需将限制设置为1,或者如果您需要多个限制,请使用for循环在过滤时迭代所有流,如下所述
导入boto3
client=boto3.client('日志')
##最新
stream\u response=client.description\u log\u streams(
logGroupName=“/aws/lambda/lambdanname”,#可以是动态的
orderBy='LastEventTime',#最新事件
limit=1#如果您只想要一个,则为最后一个最新事件
)
latestlogStreamName=stream_响应[“logStreams”][“logStreamName”]
response=client.get\u log\u事件(
logGroupName=“/aws/lambda/lambdanname”,
logStreamName=latestlogStreamName,
startTime=12345678,
endTime=12345678,
)
对于响应中的事件[“事件”]:
如果事件[“消息”][“临床ID”]=“7667”:
打印(事件[“消息”])
elif事件[“消息”][“用户名”]=“simran”+test@abc.com":
打印(事件[“消息”])
#.
#.
#更多“如果”或“否则”条件
##对于多个流,例如最新的5
stream\u response=client.description\u log\u streams(
logGroupName=“/aws/lambda/lambdanname”,#可以是动态的
orderBy='LastEventTime',#最新事件
极限=5
)
对于流_响应[“logStreams”]中的日志_流:
latestlogStreamName=log_流[“logStreamName”]
response=client.get\u log\u事件(
logGroupName=“/aws/lambda/lambdanname”,
logStreamName=latestlogStreamName,
startTime=12345678,
endTime=12345678,
)
##例如,要搜索“ClinicID=7667”,可以是动态的
对于响应中的事件[“事件”]:
如果事件[“消息”][“临床ID”]=“7667”:
打印(事件[“消息”])
elif事件[“消息”][“用户名”]=“simran”+test@abc.com":
打印(事件[“消息”])
#.
#.
#更多“如果”或“否则”条件
让我知道进展如何。您可以使用CloudWatch日志获取所需信息 您将使用
start\u query
和get\u query\u results
API:
要开始您将使用的查询(对于问题中的用例2,1和3类似):
响应将包含此格式的数据(加上一些元数据):
您是否期待其他特定功能有很多工具,如
awslogs
它们的功能基本相同。我只需要在Python bot3中完成这项工作。:)@Arun Ki在从python代码导入AWSLOG方面取得了一些成功。链接到您推荐的任何非标准工具的更多信息被认为是一种很好的形式:或者感谢您的回复。日志流名称由lambda函数自动生成,因此我事先不知道它们。我该怎么做?@SannyPatel,我的aws日志如下,我如何才能捕获整个JSON。INFO 2020-11-27 10:30:09510[[reltiodatagateway-1.0.0-SNAPSHOT].callDnB Main Flow.stage1.03]org.mule.api.processor.LoggerMessageProcessor:80916b10-309b-11eb-ab19-0242ac110002调用DnB api后的JSON输出。响应详细信息{“jobId”:5754492016394240,“成功”:“确定”,“消息”:“预定”}完美。谢谢:)你能在这里看一个相关的问题吗,请@Unkindness of datapoints你应该注意start\u query
函数()的limit
参数,默认值为1000。如果使用高密度日志,则可以忽略某些事件,而不指定更高的限制。使用日志洞察进行查询是收费的。请注意时间范围以及查询将分析的数据量。在GUI中运行相同的查询以查看其处理的数据量,注意<代码>响应[状态] 也可以是<代码>调度< /代码>,除了<代码>运行<代码>外,请考虑在< <代码> >条件下添加<代码>或响应['Sturt] '==“计划”<代码> > <代码> >条件。完整列表是链接文档中的已计划
,正在运行
,完成
,失败
,取消
,超时
和未知
。正是我在寻找的东西!你帮我省了几个小时!谢谢:)
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='simran+test@abc.com'"
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: simran+test@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local\n'
},
{
'field': 'username',
'value': 'simran+test@abc.com'
},
{
'field': 'ClinicID',
'value': '7667'
},
{
'field': 'nodename',
'value': 'MacBook-Pro-2.local\n'
}
]
]
}