Действие при событии журнала Docker

Вопрос или проблема

Мне нужно выполнить определенное действие (запустить скрипт или команду) для специфических записей в журналах нескольких контейнеров. Я ищу способ сделать это, но не нашел ничего встроенного, готового или предложений. Задача заключается в том, чтобы непрерывно читать журналы нескольких контейнеров на хосте, и если строка содержит определенные выражения, то запустить соответствующий скрипт или команду и выполнить некоторые задачи на хосте. Это должно начинаться с контейнера и заканчиваться с контейнером и работать непрерывно в фоновом режиме.

Ответ или решение

Для реализации задачи по мониторингу логов нескольких контейнеров Docker и выполнению команд или скриптов при обнаружении определенных записей в логах, можно использовать комбинацию инструментов, таких как docker logs, grep, и awk, а также написать небольшой скрипт для автоматизации процесса. Ниже представлено пошаговое руководство по созданию такого решения.

Шаг 1: Подготовка окружения

Убедитесь, что у вас установлены Docker и необходимые утилиты, такие как grep, awk, и bash.

Шаг 2: Написание скрипта

Создайте скрипт, который будет выполнять необходимые действия. Предположим, что вам нужно отфильтровывать записи, содержащие слово "ошибка" и выполнять скрипт handle_error.sh, когда такая запись будет найдена.

#!/bin/bash

# Определяем список контейнеров, которые необходимо мониторить
containers=("container1" "container2" "container3")

# Определяем выражение для фильтрации логов
log_expression="ошибка"

# Сначала остановим все фоновый процессы при завершении скрипта
trap 'kill $(jobs -p)' EXIT

# Функция для непрерывного мониторинга логов одного контейнера
monitor_logs() {
  container_name=$1
  # Запуск мониторинга логов в фоновом режиме
  docker logs -f "$container_name" 2>&1 | while read -r line; do
    echo "$line" | grep --quiet "$log_expression"
    if [ $? -eq 0 ]; then
      # Если найдена строка, содержащая выражение, выполняем скрипт
      ./handle_error.sh "$line" "$container_name"
    fi
  done
}

# Запуск мониторинга для каждого контейнера в фоновом режиме
for container in "${containers[@]}"; do
  monitor_logs "$container" &
done

# Ожидание завершения всех процессов
wait

Шаг 3: Создание скрипта для обработки

Создайте скрипт handle_error.sh, который будет выполнять нужные действия при обнаружении ошибки в логах.

#!/bin/bash

# Скрипт для обработки ошибок
error_line=$1
container_name=$2

echo "Обнаружена ошибка в контейнере $container_name: $error_line" >> error_log.txt

# Здесь можно добавить любые действия, которые необходимо выполнить
# Например, отправка уведомления, перезапуск контейнера и т.д.

Шаг 4: Запуск скрипта

Не забудьте сделать ваши скрипты исполняемыми:

chmod +x monitor_logs.sh handle_error.sh

Запустите скрипт мониторинга:

./monitor_logs.sh

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...