我有一个.netcore处理AWS Lambda,它以json格式将日志写入一个AWS CloudWatch日志流。大约写入大约200/400个日志条目,每个条目包含大约800行(最大25kb)的json数据。
一旦处理Lambda完成日志,另一个导出Lambda将日志写入excel文件并将文件导出到S3。问题是,当CloudWatch有200个条目时,它只会写入大约110个日志。我可以在控制台中看到有200个日志条目,但excel文件只包含大约110到116行。
在导出到excel之前,我首先检查日志条目的数量,并且我注意到计数不正确。应该是200但是错误地来了110.我写的代码是:
using (AmazonCloudWatchLogsClient client = new AmazonCloudWatchLogsClient("xxx", "xxx", "xx-xxxx-2"))
{
var request = new FilterLogEventsRequest()
{
LogGroupName = GroupName,
LogStreamNames = new List<string>() { StreamName }
};
Task<FilterLogEventsResponse> response = client.FilterLogEventsAsync(request);
response.Wait();
if (null != response.Result && null != response.Result.Events)
result = response.Result.Events.Count;
}
我进一步测试了当我编写简单文本而不是长json数据时,我在上面的代码中得到了适当的计数。但是,当日志包含长json数据时;我收到错误的计数。为了测试,当我将json数据剥离到少于200行时,我得到正确的计数。
那么,有没有限制?当有大量的json数据(25kb或800行)写入时,FilterLogEventsAsync()函数是否无法获取所有日志?
如果您正在获取所有事件的小例子,但有些例子因大例子而丢失,那么FilterLogEvents可能无法在单个响应中返回所有事件。
检查你得到的答案中的nextToken
字段。如果它不是null,你需要再次发出相同的请求,但这次也设置了你在之前的响应中得到的nextToken
。重复此操作直到响应不包含nextToken
。