如何使用 java 获取 Aws cloudwatch 日志

How to get the Aws cloudwatch logs using java

我们正在处理 AWS Lambda 和 Cloudwatch 日志。现在,我想通过 Java.

在不使用 logStreamName 的情况下从 Cloudwatch 日志中获取所有日志事件

由于我们以动态方式生成日志流,我不确定如何从 Cloudwatch 日志组中获取所有日志。

我知道,如果我们有日志流名称,那么我们可以使用下面的代码

ClientConfiguration clientConfig = getClientConfig();

AWSLogsClientBuilder builder = AWSLogsClientBuilder.standard();

AWSLogs logsClient= builder.withCredentials(new AWSStaticCredentialsProvider(new ProfileCredentialsProvider(profile).getCredentials())).withRegion(Regions.AP_SOUTHEAST_2).withClientConfiguration(clientConfig).build();

GetLogEventsRequest request = new GetLogEventsRequest()
                        .withStartTime(1531231200000L)
                        .withEndTime(1531576800000L)
                        .withLogGroupName("FlowLogs_GroupName")
                        .withLogStreamName("eni-xxxxx");

GetLogEventsResult result = logsClient.getLogEvents(request);

result.getEvents().forEach(outputLogEvent -> {
          System.out.println(outputLogEvent.getMessage());
}); 

由于我是这个 AWS 的新手,任何人都可以帮我提供一些代码示例吗?

您可以使用DescribeLogStreamsRequest 获取日志流名称。希望这会有所帮助

  public static void main( String[] args )
        {
            ClientConfiguration clientConfig = new ClientConfiguration();

            AWSLogsClientBuilder builder = AWSLogsClientBuilder.standard();

            AWSLogs logsClient = builder.withCredentials( new AWSStaticCredentialsProvider( new ProfileCredentialsProvider().getCredentials() ) )
                    .withRegion( Regions.AP_SOUTHEAST_2 )
                    .withClientConfiguration( clientConfig ).build();

            DescribeLogStreamsRequest describeLogStreamsRequest = new DescribeLogStreamsRequest().withLogGroupName( "FlowLogs_GroupName"  );
            DescribeLogStreamsResult describeLogStreamsResult = logsClient.describeLogStreams( describeLogStreamsRequest );

            for ( LogStream logStream : describeLogStreamsResult.getLogStreams() )
            {
                GetLogEventsRequest getLogEventsRequest = new GetLogEventsRequest()
                        .withStartTime( 1531231200000L )
                        .withEndTime( 1531576800000L )
                        .withLogGroupName( "FlowLogs_GroupName" )
                        .withLogStreamName( logStream.getLogStreamName() );

                GetLogEventsResult result = logsClient.getLogEvents( getLogEventsRequest );

                result.getEvents().forEach( outputLogEvent -> {
                    System.out.println( outputLogEvent.getMessage() );
                } );

            }
        }

所有的日志流prefix/suffix都是动态生成的,存储在ECS Cluster->Service->task 您可以使用下面的代码获取 prefix/suffix 并稍后在您的日志流名称中使用它

AmazonECS ECSclient = AmazonECSClientBuilder.standard().withClientConfiguration(clientConfig).withRegion(Regions.AP_SOUTHEAST_2).build();
        ListTasksRequest request = new ListTasksRequest().withCluster("YourClusterName").withServiceName("YourServiceName");
        ListTasksResult response = ECSclient.listTasks(request);
String taskSuffix = response.getTaskArns().get(0)

在日志流名称

中使用这个taskSuffix

希望对您有所帮助。

您可以在主包中创建resources/log4j2.xml文件并创建sl4j2.xml的内容如下link. https://docs.aws.amazon.com/lambda/latest/dg/java-logging.html 然后使用记录器对象如下。

private static final Logger logger = LoggerFactory.getLogger(Handler.class);

或者按照您看到的代码使用 LambdaLogger 对象。

LambdaLogger logger = context.getLogger();
logger.log("This should be log")

除了

如果你需要过滤日志流数据那么你可以使用FilterLogEventsRequest

这是一个例子:

 {
    ClientConfiguration clientConfig = new ClientConfiguration();


  AWSLogsClientBuilder builder = AWSLogsClientBuilder.standard();

    AWSLogs logsClient = builder.withCredentials((new ClasspathPropertiesFileCredentialsProvider("aws.properties")))
        .withRegion(Regions.US_EAST_1)
        .withClientConfiguration(clientConfig).build();

    DescribeLogStreamsRequest describeLogStreamsRequest = new DescribeLogStreamsRequest().withLogGroupName("/aws/audit");
    DescribeLogStreamsResult describeLogStreamsResult = logsClient.describeLogStreams(describeLogStreamsRequest);

    for (LogStream logStream : describeLogStreamsResult.getLogStreams()) {

// Add FilterPattern which will only fetch logs required
      FilterLogEventsRequest filterLogEventsRequest =  new FilterLogEventsRequest().withLogGroupName("/aws/audit")
         .withLogStreamNames(Arrays.asList(logStream.getLogStreamName())).withFilterPattern("vayuj");
      FilterLogEventsResult result = logsClient.filterLogEvents(filterLogEventsRequest);

      result.getEvents().forEach(outputLogEvent -> {
        System.out.println(outputLogEvent.getMessage());
      });

    }
  }