Pos*_*ion 5 amazon-ecs elasticsearch amazon-cloudwatch aws-lambda
提前感谢您的帮助.
在我的场景中 - 需要将Cloudwatch多行日志发送到elasticsearch服务.ECS - awslog-> Cloudwatch ---使用lambda - > ES Domain (基本流程虽然非常开放,可以改变数据从CW传送到ES的方式)
我能够使用multi_line_start_pattern来解决多线问题但是我现在遇到的主要问题是 - 我的日志有ODL格式(格式如下)
[yyyy-mm-ddThh:mm:ss.SSS-Z][ProductName-Version][Log Level]
[Message ID][LoggerName][Key Value Pairs][[
Message]]
Run Code Online (Sandbox Code Playgroud)
我想在存储到ES(与完整的日志行)之前解析和标记日志事件. 例如:
[2018-05-31T11:08:49.148-0400] [glassfish 4.1] [INFO] [] [] [tid: _ThreadID=43 _ThreadName=Thread-8] [timeMillis: 1527692929148] [levelValue: 800] [[
[] INFO : (DummyApplicationFunctionJPADAO) EntityManagerFactory located under resource lookup name [null], resource name=AuthorizationPU]]
Run Code Online (Sandbox Code Playgroud)
需要使用格式进行解析和标记
timestamp 2018-05-31T11:08:49.148-0400
ProductName-Version glassfish 4.1
LogLevel INFO
MessageID
LoggerName
KeyValuePairs tid: _ThreadID=43 _ThreadName=Thread-8
Message [] INFO : (DummyApplicationFunctionJPADAO)
EntityManagerFactorylocated under resource lookup name
[null], resource name=AuthorizationPU
Run Code Online (Sandbox Code Playgroud)
在上面的Key Value对中,重复并且是可变的 - 为简单起见,我可以将所有内容存储为一个长字符串.
就我收集的关于Cloudwatch的内容而言 - 似乎订阅过滤器模式reg ex支持非常有限,真的不确定如何适应上述模式.对于将数据推送到ES的lambda函数,还没有看到AWS doc或支持lambda作为解析和推送ES的方法的示例.
如果有人能够指导在进入ES =>订阅过滤器-Pattern vs lambda函数或任何其他方式之前解析CW日志的最佳选择,将会有所帮助.
谢谢 .
据我所知,您最好的选择就是您所建议的,CloudWatch 日志触发 lambda,将记录的数据重新格式化为您的 ES 首选格式,然后将其发布到 ES 中。
您需要将此 lambda 订阅到您的 CloudWatch 日志。您可以在 lambda 控制台或 cloudwatch 控制台 ( https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html ) 上执行此操作。
lambda 的event有效负载将为:{ "awslogs": { "data": "encoded-logs" } }。其中encoded-logs是 gzip 压缩 JSON 的 Base64 编码。
例如,可以在节点中对示例事件 ( https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-cloudwatch-logs ) 进行解码,例如使用:
const zlib = require('zlib');
const data = event.awslogs.data;
const gzipped = Buffer.from(data, 'base64');
const json = zlib.gunzipSync(gzipped);
const logs = JSON.parse(json);
console.log(logs);
/*
{ messageType: 'DATA_MESSAGE',
owner: '123456789123',
logGroup: 'testLogGroup',
logStream: 'testLogStream',
subscriptionFilters: [ 'testFilter' ],
logEvents:
[ { id: 'eventId1',
timestamp: 1440442987000,
message: '[ERROR] First test message' },
{ id: 'eventId2',
timestamp: 1440442987001,
message: '[ERROR] Second test message' } ] }
*/
Run Code Online (Sandbox Code Playgroud)
根据您所概述的内容,您需要提取数组logEvents,并将其解析为字符串数组。如果您需要的话,我也很乐意在这方面提供一些帮助(但我需要知道您用什么语言编写 lambda - 有用于标记 ODL 的库 - 所以希望这不是太难)。
此时您可以将POST这些新记录直接添加到您的 AWS ES 域中。有点神秘的是,S3-to-ES 指南很好地概述了如何在 python 中执行此操作: https: //docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-aws-integrations.html#es -aws-integrations-s3-lambda-es
您可以在这里找到执行所有这些操作的 lambda 完整示例(由其他人提供): https: //github.com/blueimp/aws-lambda/tree/master/cloudwatch-logs-to-elastic-cloud
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |