更新多个EC2实例上的日志级别

时间:2017-02-08 13:24:20

标签: java spring amazon-ec2 logback slf4j

我的应用在多个EC2实例上运行,以确保高可用性。应用的默认日志级别为INFO。但有时出于调试目的,我想将日志级别更新为DEBUG。更新日志级别的请求通过ElasticLoadBalancer,该请求将请求委派给多个EC2实例中的任何一个。此实例上运行的应用程序的日志级别已更新,但其他实例上的应用程序仍将记录级别INFO。我希望所有应用都以DEBUG级别登录。

我正在使用Spring,SLF4J和Logback。

如果我以某种方式使日志级别信息集中,并且请求将更新集中位置上的级别,但仍有人必须在所有实例上关于更改的应用程序,因为应用程序永远不会请求日志级别。

4 个答案:

答案 0 :(得分:2)

如果您需要AWS解决方案,可以使用sns。

一旦您的应用程序被实例化,请将其端点(使用它的私有IP)注册到sns主题以获取http通知。 因此,您可以发出sns消息而不是通过负载均衡器更改LOG级别,并将消息发送到已注册的端点。

请注意,一旦应用程序终止,请从sns取消注册http端点。

答案 1 :(得分:1)

您可能需要查看Zookeeper

  

ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。

设置起来非常简单并从小处着手。在EC2节点上运行的应用程序只需要实现一个"监听器/观察器"接口。这将在某些配置更改时通知您的应用程序(例如,您决定要将全局日志级别设置为DEBUG)。

基于此配置更改,您的所有节点都将更新本地日志级别,而无需您提供各种ELB绕过手动REST调用以告知每个节点更新 - 确切地说是zookeeper正在解决的问题:

  

每次实施它们都需要做很多工作来修复不可避免的错误和竞争条件。由于难以实现这些类型的服务,应用程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。即使正确完成,这些服务的不同实现也会在部署应用程序时导致管理复杂性。

当这对您有用时,您可以根据需要向zookeeper添加其他配置,限制在部署的应用程序中打包或与其一起复制所需的配置量。

答案 2 :(得分:0)

Amazons Remote Management(运行命令)允许您在实例上运行命令。您只需要一个简单的脚本来更改日志级别。

但要设置它并设置所有必需的IAM rights

并不容易

答案 3 :(得分:0)

有一个实例的标签。默认情况下存在一些标记,您可以创建自己的标记。因此,如果我们添加一个标记,用于标识当前正在运行应用的所有实例,我们可以非常轻松地获取所有这些实例' IP地址。

DescribeInstancesRequest request = new DescribeInstancesRequest();

Filter filter1 = new Filter("tag:Environment", Collections.singletonList("Sandbox"));
Filter filter2 = new Filter("tag:Application", Collections.singletonList("xxxxx"));
Filter filter3 = new Filter("tag:Platform", Collections.singletonList("xxxx"));

InstanceProfileCredentialsProvider mInstanceProfileCredentialsProvider =
                new InstanceProfileCredentialsProvider();
AWSCredentials credentials = mInstanceProfileCredentialsProvider.getCredentials();

AmazonEC2 ec2Client = new AmazonEC2Client(credentials);
List<String> privateIps = new ArrayList<>();

ec2Client.describeInstances(request.withFilters(filter1, filter2, filter3)).getReservations().forEach(
                reservation -> reservation
                        .getInstances()
                        .forEach(instance -> privateIps.add(instance.getPrivateIpAddress())));

for (String privateIp : privateIps) {
     hitTheInstance(privateIp);
}

在这里,我使用了3个标签来过滤掉实例。