【问题标题】:How to get the Aws cloudwatch logs using java如何使用 java 获取 Aws cloudwatch 日志
【发布时间】:2019-01-07 10:33:46
【问题描述】:

我们正在处理 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 新手,谁能帮我提供一些代码示例?

【问题讨论】:

    标签: java amazon-web-services aws-lambda amazon-cloudwatchlogs


    【解决方案1】:

    您可以使用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() );
                    } );
    
                }
            }
    

    【讨论】:

      【解决方案2】:

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

      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

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        您可以在主包中创建resources/log4j2.xml文件,并按照链接创建sl4j2.xml的内容。 https://docs.aws.amazon.com/lambda/latest/dg/java-logging.html 然后按如下方式使用logger对象。

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

        或者按照你可以看到的代码使用LambdaLogger的对象。

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

        【讨论】:

          【解决方案4】:

          除了 https://stackoverflow.com/a/54074465/11090297

          如果您需要过滤日志流数据,那么您可以使用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());
                });
          
              }
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-21
            • 2020-03-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多