Java 在多个EC2实例上更新日志级别
我的应用程序在多个EC2实例上运行,以确保高可用性。应用程序的默认日志级别为Java 在多个EC2实例上更新日志级别,java,spring,amazon-ec2,logback,slf4j,Java,Spring,Amazon Ec2,Logback,Slf4j,我的应用程序在多个EC2实例上运行,以确保高可用性。应用程序的默认日志级别为INFO。但有时出于调试目的,我希望将日志级别更新为DEBUG。更新日志级别的请求通过ElasticLoadBalancer,该请求将委托给多个EC2实例中的任何一个。该实例上运行的应用程序的日志级别已更新,但其他实例上的应用程序仍将以INFO级别进行日志记录。我希望所有应用都以DEBUG级别登录 我正在使用Spring、SLF4J和Logback 如果我以某种方式将日志级别信息集中化,请求将更新集中位置上的级别,但仍有
INFO
。但有时出于调试目的,我希望将日志级别更新为DEBUG
。更新日志级别的请求通过ElasticLoadBalancer
,该请求将委托给多个EC2实例中的任何一个。该实例上运行的应用程序的日志级别已更新,但其他实例上的应用程序仍将以INFO
级别进行日志记录。我希望所有应用都以DEBUG
级别登录
我正在使用Spring、SLF4J和Logback
如果我以某种方式将日志级别信息集中化,请求将更新集中位置上的级别,但仍有人必须告知所有实例上的应用程序有关更改,因为应用程序将永远不会请求日志级别。您可能想看一看: ZooKeeper是一种集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务 很容易设置和从小处开始。在EC2节点上运行的应用程序只需要实现一个“侦听器/观察者”界面。当某些配置更改时(例如,您决定将全局日志级别设置为
DEBUG
),这将通知您的应用程序
基于此配置更改,您的所有节点都将更新本地日志级别,而无需绕过手动REST调用来提出各种ELB,以通知每个节点进行更新-这正是zookeeper正在解决的问题:
每次实现它们时,都会有大量的工作用于修复不可避免的bug和竞争条件。由于实现这类服务的困难,应用程序最初通常会忽略它们,这使得它们在发生变化时变得脆弱,难以管理。即使操作正确,这些服务的不同实现在部署应用程序时也会导致管理复杂性
当这对您有效时,如果需要,您可以向zookeeper添加其他配置,限制需要打包到已部署应用程序中或与之一起复制的配置量。如果您想要AWS解决方案,您可以利用sns 一旦你的应用程序被实例化,将它的端点(使用它的私有ip)注册到一个sns主题以获得http通知。 因此,您可以发出sns消息,并将该消息发送到已注册的端点,而不是通过负载平衡器更改日志级别 请记住,一旦应用程序终止,请从sns注销http端点。(运行命令)允许您在实例上运行命令。您只需要一个简单的脚本来更改日志级别
但要设置它并设置所需的全部权限并不容易:有一个实例的标记。默认情况下存在一些标记,您可以创建自己的标记。所以,如果我们添加一个标记来标识当前运行应用程序的所有实例,我们就可以很容易地获取所有这些实例的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);
}
DescribeInstancesRequest请求=新的DescribeInstancesRequest();
FilterFilter1=新过滤器(“标记:环境”,Collections.singletonList(“沙盒”);
Filter filter2=新过滤器(“标记:应用程序”,Collections.singletonList(“xxxxx”);
Filter filter3=新过滤器(“标记:平台”,Collections.singletonList(“xxxx”);
InstanceProfileCredentialsProvider分钟InstanceProfileCredentialsProvider=
新InstanceProfileCredentialsProvider();
AWSCredentials credentials=mInstanceProfileCredentialsProvider.getCredentials();
AmazonEC2 ec2Client=新的AmazonEC2客户端(凭据);
List privateIps=new ArrayList();
ec2Client.descripbeInstances(request.withFilters(filter1、filter2、filter3)).getReservations().forEach(
预订->预订
.getInstances()
.forEach(instance->privateIps.add(instance.getPrivateIpAddress());
for(字符串privateIp:privateIps){
hitTheInstance(私有);
}
在这里,我使用了3个标记来过滤实例