AWS CloudWatch日志订阅过滤器解码 [英] AWS CloudWatch log subscription filters decode

查看:374
本文介绍了AWS CloudWatch日志订阅过滤器解码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用CloudWatch日志订阅过滤器流到Lambda,并将消息发布到SNS主题.但是它将输出乱码消息,并且无法成功解码.

I am using CloudWatch log subscription filters stream to Lambda and publish a message to an SNS topic. But it will output garbled message and can't success decode.

我的输出:

k
%"
 jVbB

如果不解码,将输出以下内容:

If not decode will output like this:

{ "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} }

下面是我的代码,它使用的是nodejs:

My code is below and it is using nodejs:

console.log("Loading function");
var AWS = require("aws-sdk");

exports.handler = function(event, context) {
    var eventText = JSON.stringify(event, null, 2);
    var decodeText = new Buffer(eventText, 'base64').toString('ascii');
    console.log("Received event:", eventText);
    var sns = new AWS.SNS();
    var params = {
        Message: decodeText, 
        Subject: "Test SNS From Lambda",
        TopicArn: "arn:aws:sns:region:account:snsTopic"
    };
    sns.publish(params, context.done);
};

推荐答案

CloudWatch日志以gzip压缩和base64编码的列表形式传递到已订阅的Lambda函数.

CloudWatch Logs are delivered to the subscribed Lambda function as a list that is gzip-compressed and base64-encoded.

以下是如何解码和解压缩日志列表的示例:

Here is an example of how to decode and unzip the list of logs:

const zlib = require('zlib');

exports.handler = async (event) => {
  if (event.awslogs && event.awslogs.data) {
    const payload = Buffer.from(event.awslogs.data, 'base64');

    const logevents = JSON.parse(zlib.unzipSync(payload).toString()).logEvents;

    for (const logevent of logevents) {
      const log = JSON.parse(logevent.message);
      console.log(log);
    }
  }
};

这篇关于AWS CloudWatch日志订阅过滤器解码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆