Вступление
Журналы Cloudwatch – это один из сервисов, предлагаемых AWS под названием cloudwatch. Как следует из названия, он используется для мониторинга и хранения журналов. Эти журналы могут быть сгенерированы из различных служб/ресурсов, таких как ECS, Lambda, пакетные задания (EC2 в целом) и так далее. В этом посте мы рассмотрим анатомию журналов cloudwatch и некоторые примеры кода для извлечения этих журналов.
Анатомия
Существует 3 основных термина, связанных с сервисом:
Группа журналов : В руководстве пользователя группа журналов определяется как Группа журналов – это группа потоков журналов, которые используют одни и те же параметры хранения, мониторинга и контроля доступа. Чтобы упростить это, вы также можете представить группу журналов как совокупность всех журналов, принадлежащих определенной службе. Например, у вас может быть группа журналов для службы ecs, большая группа для лямбды и так далее. В большинстве случаев AWS по умолчанию создаст для вас группы журналов.
Поток журнала : Потоки журналов представляют собой последовательность событий журналов (определенных ниже), поступающих из одного и того же источника. Например, подумайте о выполнении лямбды: все журналы, созданные одним полным выполнением лямбды , окажутся в одном потоке журналов. Аналогично, все журналы, созданные одним полным выполнением пакетного задания , также окажутся в одном потоке журналов.
Событие журнала : Каждый отдельный фрагмент журнала, каждый
Logger.info ()
, каждыйSystem.out.println()
, каждыйprint()
представляет собой одно событие журнала. Событие журнала имеет 3 свойства: a) Сообщение (фактическое сообщение) b) Временная метка (когда было сгенерировано сообщение) c) Временная метка приема (когда сообщение было передано в cloudwatch)
На следующем рисунке показана связь между группой журналов, потоками журналов и событие журнала
Использование Java SDK
В этой части мы рассмотрим извлечение всех журналов из определенного потока журналов. Это может быть полезно, если вы хотите автоматизировать некоторую обработку журнала, скажем, в случае сбоя lambda.s
- Зависимость от Maven (упомянутая версия предназначена для символических целей, убедитесь, что вы выбрали последнюю версию или версию, совместимую с вашими существующими зависимостями)
com.amazonaws aws-java-sdk-logs 1.11.519
- Создать Клиент Журналов (По Умолчанию)
AWSLogs logsClient = AWSLogsClientBuilder.defaultClient();
- Извлечение журналов Сначала нам нужно создать объект запроса. Для начала мы передадим имя группы журналов и имя потока журналов
GetLogEventsRequest logEventsRequest = new GetLogEventsRequest(logGroupName, logStreamName)
Теперь мы можем использовать клиент, который мы создали выше, для получения журналов:
GetLogEventsResult logEventsResult = logsClient.getLogEvents(logEventsRequest);
GetLogEventResult содержит следующую информацию:
- список событий журнала
Список
- следующий шаг вперед знак
- следующий обратный токен
Что это за жетоны? Когда мы выполняем вызов для получения событий журнала, результат может содержать не весь журнал; существует ограничение в 1 МБ (10000 событий журнала). Если в конкретный поток журналов больше не записываются журналы, то у вас в основном будут старые события журнала, которые необходимо извлечь с помощью следующего обратного токена . Если в потоке журнала есть новые события журнала, то использование next forward token приведет к большему количеству событий журнала. В таком случае лучше предположить, что первый результат, который мы получаем, приводит нас к середине журналов и что нам нужно пройти назад и вперед , чтобы получить полную картину.
Визуальное Представление Использования Токенов Для Получения Большего Количества Журналов
Мы можем сделать это итеративно или рекурсивно. Ниже приведен пример кода для итеративного использования токенов:
ListoutputLogEvents = new LinkedList<>(); GetLogEventsResult eventsResult = new GetLogEventsResult(); String nextToken = token; do{ logEventsRequest.setNextToken(nextToken); eventsResult = logsClient.getLogEvents(logEventsRequest); outputLogEvents.addAll(eventsResult.getEvents()); nextToken = tokenDirection.equals(TOKEN_DIRECTION.BACKWARD) ? eventsResult.getNextBackwardToken() : eventsResult.getNextForwardToken(); LOGGER.info("Next Token: " + nextToken); }while (CollectionUtils.isNotEmpty(eventsResult.getEvents()));
Вы можете помнить о последовательности во время обхода или просто извлечь все события и отсортировать их, используя временную метку.
outputLogEvents .stream() .sorted(Comparator.comparing(OutputLogEvent::getTimestamp)) .collect(Collectors.toList());
На этом статья подходит к концу. Ваше здоровье!
Дальнейшее чтение и ссылки Используемый
a- Руководство пользователя Cloudwatch Logs b- SDK Javadoc
Оригинал: “https://dev.to/crawlingcrusader/anatomy-of-cloudwatch-logs-26lg”