Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用boto3查询cloudwatch日志_Python_Amazon Web Services_Aws Lambda_Boto3_Amazon Cloudwatch - Fatal编程技术网

如何在python中使用boto3查询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

我有一个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@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小时之间的任何地方

例如:

  • 查询最近5小时内的Cloudwatch日志,其中
    ClinicID=7667
  • 查询过去5小时内的Cloudwatch日志,其中
    ClinicID=7667
    username='simran+test@abc.com“
  • 查询过去5小时内的Cloudwatch日志,其中
    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'
          }
        ]
      ]
    }