boto3 filter_log_events 不返回 cloudwatch 日志

양정훈*_*양정훈 2 boto amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs

我使用 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,
)
Run Code Online (Sandbox Code Playgroud)

例如)开始时间: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
}]
Run Code Online (Sandbox Code Playgroud)

例如2)开始时间:2019-12-23 00:00:00,结束时间: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
}]
Run Code Online (Sandbox Code Playgroud)

我认为这是因为日志流太多

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

Hoa*_*han 5

如果您在响应中收到下一个令牌,请继续执行将会有一个令牌不返回任何内容,但会有一个令牌返回您继续滚动的结果。

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

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

  • 有趣的是,AWS API 和 SDK 的行为是这样的。 (2认同)

aam*_*r23 5

这是因为 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']
Run Code Online (Sandbox Code Playgroud)