簡體   English   中英

更新多個EC2實例上的日志級別

[英]Updating log level on multiple EC2 instances

我的應用程序在多個EC2實例上運行,以確保高可用性。 應用程序的默認日志級別為INFO 但有時出於調試目的,我想將日志級別更新為DEBUG 更新日志級別的請求通過ElasticLoadBalancer ,后者將請求委托給多個EC2實例中的任何一個。 在該實例上運行的應用程序的日志級別已更新,但其他實例上的應用程序仍將記錄在INFO級別。 我希望所有應用程序都能在DEBUG級別登錄。

我正在使用Spring,SLF4J和Logback。

如果我以某種方式使日志級別信息集中,並且請求將更新集中位置上的級別,但仍然有人必須在所有實例上關於更改的應用程序,因為應用程序永遠不會請求日志級別。

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

一旦您的應用程序被實例化,請將其端點(使用它的私有IP)注冊到sns主題以獲取http通知。 因此,您可以發出sns消息而不是通過負載均衡器更改LOG級別,並將消息發送到已注冊的端點。

一旦應用程序終止,請記住從sns取消注冊http端點。

你可能想看看Zookeeper

ZooKeeper是一種集中式服務,用於維護配置信息 ,命名,提供分布式同步和提供組服務。

它很容易設置並從小處開始。 在EC2節點上運行的應用程序只需要實現“監聽器/觀察器”界面。 這將在某些配置發生更改時通知您的應用程序(例如,您決定要將全局日志級別設置為DEBUG )。

基於此配置更改,您的所有節點都將更新本地日志級別,而無需您提供各種ELB旁路手動REST調用來告知每個節點更新 - 確切地說是zookeeper正在解決的問題:

每次實施它們都需要做很多工作來修復不可避免的錯誤和競爭條件。 由於難以實現這些類型的服務,應用程序最初通常會吝嗇它們,這使得它們在變化的情況下變得脆弱並且難以管理。 即使正確完成,這些服務的不同實現也會在部署應用程序時導致管理復雜性。


當這對您有用時,您可以根據需要向zookeeper添加其他配置,限制在已部署的應用程序中打包或與其一起復制所需的配置量。

亞馬遜遠程管理 (運行命令)允許您在實例上運行命令。 您只需要一個簡單的腳本來更改日志級別。

但要設置它並設置授予所有必需的IAM權限並不容易:

有一個實例的標簽。 默認情況下存在一些標記,您可以創建自己的標記。 因此,如果我們添加一個標記來標識當前正在運行應用程序的所有實例,我們可以非常輕松地獲取所有這些實例的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個標簽來過濾掉實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM