如何使用 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());
});
}
}
我们正在处理 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());
});
}
}