2017-02-08 6 views
1

Мое приложение работает с несколькими экземплярами EC2 для обеспечения высокой доступности. Уровень журнала по умолчанию - INFO для приложения. Но иногда для целей отладки я хочу обновить уровень журнала до DEBUG. Запрос на обновление уровня журнала проходит через ElasticLoadBalancer, который делегирует запрос любому из нескольких экземпляров EC2. Уровень журнала для приложения, запущенного в этом экземпляре, обновляется, но приложения на других экземплярах будут регистрироваться на уровне INFO. Я хочу, чтобы все приложения регистрировались на уровне DEBUG.Обновление уровня журнала в нескольких экземплярах EC2

Я использую Spring, SLF4J и Logback.

Если я каким-то образом сделаю информацию уровня журнала доступной, и запрос будет обновлять уровень в централизованном месте, но все же кто-то должен интродуцировать приложения во всех экземплярах об изменении, поскольку приложение никогда не будет запрашивать уровень журнала ,

ответ

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 тега, чтобы отфильтровывать экземпляры.

1

Вы можете посмотреть на Zookeeper:

Zookeeper централизованная служба для поддержания информации о конфигурации, нейминг, обеспечивая распределенную синхронизацию, а также предоставление услуг в группе.

Это очень легко настроить и начать с малого. Приложение, работающее на ваших узлах EC2, должно просто реализовать интерфейс «слушатель/наблюдатель». Это уведомит ваше приложение, когда какая-то конфигурация изменится (например, вы решили установить глобальный уровень журнала на DEBUG).

Основываясь на этом изменении конфигурации, все ваши узлы будут обновлять локальный уровень журналов, не прибегая к использованию всех типов ELB-обходных REST-вызовов, чтобы сообщить каждому узлу об обновлении - именно то, что zookeeper Решение:

Каждый раз, когда они выполняются, есть много работы, которая заключается в исправлении ошибок и условий гонки, которые неизбежны. Из-за сложности внедрения этих видов услуг приложения обычно обычно экономят на них, что делает их хрупкими при наличии изменений и их трудно справиться. Даже когда все сделано правильно, различные реализации этих служб приводят к сложности управления при развертывании приложений.


Когда это работает для вас, вы можете добавить дополнительные настройки в случае необходимости зоопарка, ограничивая количество конфигурации, что вам нужно упаковать в развернутых приложениях или скопирован вместе с ними.

2

Если вы хотите использовать решение AWS, вы можете использовать sns.

Как только ваше приложение будет создано, зарегистрируйте его конечную точку (используя ее частный ip) в теме sns для уведомления по электронной почте. Таким образом, вместо того, чтобы изменять уровень входа в систему через балансировщик нагрузки, вы можете выдать сообщение sns, и сообщение должно быть отправлено зарегистрированным конечным точкам.

Имейте в виду, чтобы удалить регистрацию конечной точки http из sns, как только приложение будет завершено.

0

Amazons Remote Management (команда запуска) позволяет запускать команды в своих экземплярах. Вам просто нужен простой скрипт для изменения loglevel.

Но это не так легко установить его и установить предоставить всю необходимую IAM rights: