我的应用在多个EC2实例上运行,以确保高可用性。应用的默认日志级别为INFO
。但有时出于调试目的,我想将日志级别更新为DEBUG
。更新日志级别的请求通过ElasticLoadBalancer
,该请求将请求委派给多个EC2实例中的任何一个。此实例上运行的应用程序的日志级别已更新,但其他实例上的应用程序仍将记录级别INFO
。我希望所有应用都以DEBUG
级别登录。
我正在使用Spring,SLF4J和Logback。
如果我以某种方式使日志级别信息集中,并且请求将更新集中位置上的级别,但仍有人必须在所有实例上关于更改的应用程序,因为应用程序永远不会请求日志级别。
答案 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个标签来过滤掉实例。