gpt4 book ai didi

java - 解析 CloudWatch 日志流的 AWS Lambda

转载 作者:行者123 更新时间:2023-11-30 08:31:44 29 4
gpt4 key购买 nike

我正在编写一个 AWS Lambda 来处理来自 CloudWatch 的日志流。我正在用 Java 实现它。我正在努力解决几个问题:

  1. 如何解码和解压缩收到的日志。在 Python 中,以下代码有效:
import json
import base64
import zlib

def stream_gzip_decompress(stream):
dec = zlib.decompressobj(32 + zlib.MAX_WBITS) # offset 32 to skip the header
foo=''
for chunk in stream:
rv = dec.decompress(chunk)
if rv:
foo += rv
return foo

def lambda_handler(event, context):
# Decode and decompress the AWS Log stream to extract json object
stream=json.dumps(event['awslogs']['data'])
payload=json.loads(stream_gzip_decompress(stream.decode('base64')))
print(payload)

如何在 Java 中实现类似的功能?

  1. 此外,当我尝试添加外部 jar org.json 来解析输入 JSON 数据时。尽管我尝试了 stackoverflow 上给出的大部分内容,但我遇到了以下错误

错误:

{ "errorMessage": "Error loading class UpdateCurrentNotificationStatus: org/json/JSONException",
"errorType": "class java.lang.NoClassDefFoundError" }

以下是我正在编写的示例代码:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.json.JSONException;
import org.json.JSONObject;

import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.amazonaws.services.lambda.runtime.Context;

public class UpdateCurrentNotificationStatus implements RequestStreamHandler {
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
throws IOException {
int letter;
while((letter = inputStream.read()) != -1)
{
//outputStream.write(Character.toUpperCase(letter));
JSONObject json = new JSONObject(letter);
try {
String stream = json.getString("awslogs");
System.out.println(stream);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

有人可以帮我解决这个问题吗?

谢谢你,

普拉萨德

最佳答案

您需要做的是接受 CloudWatchLogsEvent 作为输入参数。

    public class Testing implements RequestHandler<CloudWatchLogsEvent, String> {


public String handleRequest(CloudWatchLogsEvent request, Context context){
context.getLogger().log(request.toString());
String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(Calendar.getInstance().getTime());
context.getLogger().log("Invocation started: " + timeStamp);

context.getLogger().log(request.toString());

timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(Calendar.getInstance().getTime());
context.getLogger().log("Invocation completed: " + timeStamp);
return "completed";
}
}

请记住,这也会打印经过 gzip 压缩的编码 base 64 字符串。您必须对其进行解码和解压缩。网上有关于如何做到这一点的示例,所以我不会深入研究。一个例子在这里 Decode Base64 encoded ZIP archive (GZIP)

关于java - 解析 CloudWatch 日志流的 AWS Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40512868/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com