Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个EC2实例上更新日志级别_Java_Spring_Amazon Ec2_Logback_Slf4j - Fatal编程技术网

Java 在多个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 如果我以某种方式将日志级别信息集中化,请求将更新集中位置上的级别,但仍有

我的应用程序在多个EC2实例上运行,以确保高可用性。应用程序的默认日志级别为
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个标记来过滤实例