【问题标题】:boto3 filter_log_events doesn't return cloudwatch logsboto3 filter_log_events 不返回 cloudwatch 日志
【发布时间】:2020-04-25 14:16:00
【问题描述】:

我使用 python 3.7,boto3 1.9.196

单个日志组中有多个日志流(超过 800 个)

组名:我的板

流名称:my-board-20191223-00、my-board-20191223-01 ... my-board-20191223-23

每个流名称设置为当前日期时间 (YYYYMMDD-HH)

self._client.filter_log_events(
    logGroupName=log_group,
    startTime=start_timestamp,
    endTime=end_timestamp,
    filterPattern=filterPattern,
    limit=limit,
)

例如)开始时间:2019-11-07 00:00:00,结束时间:2019-11-08 23:59:59

它返回多个事件

'events': [ blabla... ]
'searchedLogStreams':[
{
    'logStreamName': 'my-board-20191101-17',
    'searchedCompletely': True
}, 
    blabla...
{
    'logStreamName': 'my-board-20191107-14',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191107-21',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191107-22',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191107-23',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191108-00',
    'searchedCompletely': False # FALSE
}]

eg2) startTime : 2019-12-23 00:00:00, endTime : 2019-12-24 23:59:59

但是,它不返回任何事件!

'events': [], # EMPTY
'searchedLogStreams': [{
    'logStreamName': 'my-board-20191101-17',
    'searchedCompletely': True
},
    blabla...
{
    'logStreamName': 'my-board-20191102-17',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191105-16',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-13',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-14',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-19',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-20',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-21',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-22',
    'searchedCompletely': True
}, {
    'logStreamName': 'my-board-20191112-23',
    'searchedCompletely': True # TRUE
}]

我认为是因为日志流太多

为什么它不起作用?以及如何解决?

【问题讨论】:

    标签: amazon-web-services boto amazon-cloudwatch amazon-cloudwatchlogs


    【解决方案1】:

    这是因为boto3客户端在完全加载所有日志之前返回了响应。此外,一个响应中返回的日志数量有一个限制(1 MB 或 10000 个事件)。 我遇到了同样的情况,并且能够使用@HoaPhan 的使用 nextToken 的建议。以下是我的设置方法,它可以根据需要发出尽可能多的请求来获取所有日志。

    results = []
    
    response = client.filter_log_events(
        logGroupName = log_group,
        logStreamNamePrefix = prefix,
        filterPattern = pattern
    )
    
    results = results + response['events']
    
    while 'nextToken' in response.keys():
         currentToken = response['nextToken']
          
         response = client.filter_log_events(
                    logGroupName = log_group,
                    logStreamNamePrefix = prefix,
                    nextToken = currentToken,
                    filterPattern = pattern
                   )
    
         results = results + response['events']
    

    【讨论】:

      【解决方案2】:

      如果您在响应中获得下一个令牌,请继续执行 会有一个什么都不返回的令牌,但会有一个你不断滚动的结果。

      currentToken = response['nextToken']
      response = client.filter_log_events(
              limit = 10000,
              filterPattern= filterPattern,
              startTime= start_timestamp,
              logGroupName= log_group,
              nextToken=currentToken)
      print(response)
      

      我也遇到了同样的情况。我最好的猜测是滚动和过滤是独立的。如果您删除过滤器参数(时间,子序列调用中的模式,您会发现它返回的事件与初始调用不匹配)。

      【讨论】:

      • 这对我也有用。但是,对于短日志,我得到 2 个有效/不同的 nextToken(需要 3 个请求)在它不断变化之前,我没有看到任何其他提前停止的迹象
      • 继续下去,直到没有更多的 nextToken
      • 文档建议在nextForwardToken 与提供的相同时停止。但是,我的观点是,您仍然可以在没有内容的情况下执行 2 次无关的操作,这有点可惜。
      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多