Когда серверов становится больше трёх, привычка заходить на каждый по SSH и читать journalctl по отдельности перестаёт работать. Нужен единый поиск по всем журналам, общая шкала времени и сохранённые запросы, к которым можно вернуться через неделю. Graylog решает эту задачу: принимает логи по syslog, GELF, Beats и HTTP, раскладывает их по индексам и даёт веб-интерфейс с языком поиска. Ниже — установка Graylog Open, приём логов, рабочие запросы, потоковая обработка и диагностика.
Из чего состоит Graylog
Система делится на три слоя. Сервер graylog-server принимает сообщения, выполняет правила обработки и обслуживает веб-интерфейс с API. MongoDB хранит конфигурацию: пользователей, источники, потоки, дашборды и определения событий. OpenSearch или Elasticsearch хранит сами сообщения в индексах. В свежих сборках вместо внешнего поискового движка можно поставить Graylog Data Node — тот же OpenSearch в управляемой упаковке.
Для небольшой лаборатории хватит четырёх ядер, 8–16 ГБ памяти и быстрого диска. Основные порты: 9000 — веб-интерфейс и API, 9200 — поисковый движок, 27017 — MongoDB, 5140 — syslog, 5044 — Beats, 12201 — GELF. Наружу публикуйте только 9000, и то через обратный прокси с TLS.
Установка и первичная настройка
Ставьте пакеты из официального репозитория проекта: версия в репозитории дистрибутива обычно сильно отстаёт. Для Debian и Ubuntu последовательность выглядит так:
GRAYLOG_BRANCH=6.1
wget https://packages.graylog2.org/repo/packages/graylog-${GRAYLOG_BRANCH}-repository_latest.deb
sudo dpkg -i graylog-${GRAYLOG_BRANCH}-repository_latest.deb
sudo apt update && sudo apt install graylog-server
Ветку возьмите актуальную из раздела загрузок на сайте проекта. MongoDB и поисковый движок Graylog не устанавливает: поставьте MongoDB и OpenSearch либо пакет Data Node отдельно и запустите их службы до старта сервера. Затем сгенерируйте два секрета: password_secret для шифрования и хеш пароля администратора.
openssl rand -hex 48
echo -n 'StrongPassw0rd' | sha256sum | cut -d' ' -f1
Пропишите значения в /etc/graylog/server/server.conf вместе с адресами:
password_secret = <первая строка>
root_password_sha2 = <вторая строка>
http_bind_address = 0.0.0.0:9000
elasticsearch_hosts = http://127.0.0.1:9200
mongodb_uri = mongodb://127.0.0.1:27017/graylog
Запустите службу и проверьте журнал. Первый старт занимает минуту: сервер создаёт коллекции и индексы.
sudo systemctl enable --now graylog-server
systemctl status graylog-server --no-pager
journalctl -u graylog-server -n 80 --no-pager
Приём логов
Источник создаётся в разделе System → Inputs. Для Linux-хостов удобен Syslog UDP на порту 5140, для приложений — GELF TCP 12201, для агентов — Beats 5044. На клиенте достаточно строки в /etc/rsyslog.d/90-graylog.conf:
*.* @192.168.10.20:5140
# TCP: *.* @@192.168.10.20:5140
sudo systemctl restart rsyslog
Проверьте, что пакеты доходят: в веб-интерфейсе откройте Search и выберите последний час. Если сообщений нет, смотрите счётчик на странице Inputs и слушайте порт через ss -lunp | grep 5140. Не забудьте открыть порт в файрволе только для своих подсетей.
Поиск: синтаксис, который экономит время
Строка поиска состоит из условий по полям. Операторы AND, OR, NOT пишутся заглавными, значения с пробелами берутся в кавычки. Символ * заменяет часть строки, а сравнения работают с числами и датами.
source:web01 AND level:<=3
http_response_code:>=500 AND NOT source:healthcheck
message:"connection refused"
source:db* AND timestamp:2026-05-01T10:00:00.000Z
Слева откройте панель полей: она показывает, какие значения встречаются в текущей выдаче. Щёлкнув по значению, вы добавите условие в запрос. Полезные приёмы: сохранить поиск кнопкой Save, закрепить диапазон времени и включить Auto-refresh для наблюдения за инцидентом. Для регулярных отчётов используйте Export в CSV.
source— хост или приложение, отправившее запись.level— числовой уровень syslog.message— текст, по которому идёт полнотекстовый поиск.timestamp— время события в UTC.
Потоки, правила и алерты
Поток (Stream) — это постоянный фильтр, который направляет сообщения в отдельный индекс и подписывает на них людей. Правило задаётся либо простым совпадением по полю, либо регулярным выражением. Дальше сообщения можно обогащать в Pipeline: разбирать JSON, приводить имена полей к общему виду и выставлять признак ошибки.
rule "nginx_5xx"
when
has_field("http_response_code")
then
set_field("is_error", to_long($message.http_response_code) >= 500);
end
Правило применяется к потоку в разделе Pipelines. Для уведомлений создайте Event Definition: условие по запросу, порог срабатывания и интервал проверки. В качестве действия выберите почту, HTTP-хук или интеграцию с мессенджером. Обязательно задайте период ожидания, иначе во время всплеска ошибок придёт сотня одинаковых писем.
Хранение и ротация индексов
Сообщения лежат в Index Set. Именно там настраиваются стратегия ротации и срок хранения. Для потока с высоким объёмом ставьте ротацию по размеру, для аудита — по времени. Удаление старых индексов дешевле, чем хранение всего на быстром диске, но не удаляйте данные, которые нужны для разбора инцидентов.
Проверьте свободное место и состояние кластера:
df -h /var/lib/opensearch /var/lib/graylog-server
curl -s http://127.0.0.1:9200/_cluster/health?pretty
curl -s -u admin:'пароль' http://127.0.0.1:9000/api/system | jq '.version'
Если диск заполнен, Graylog перестаёт принимать сообщения. Настройте мониторинг занятости раздела и порог оповещения заранее.
Доступ и TLS
Веб-интерфейс не должен смотреть в интернет напрямую. Graylog умеет TLS сам: параметры http_enable_tls, http_tls_cert_file и http_tls_key_file; сертификат можно выпустить внутренним центром. Если перед сервером стоит Nginx, передавайте реальный адрес через X-Forwarded-For и не забудьте про заголовок X-Requested-By для API. Заведите отдельного пользователя с ролью Reader для дежурной смены и не используйте admin в повседневной работе. API-токены создаются в профиле и отзываются независимо от пароля.
Диагностика
Большинство проблем видны в журнале службы: несовместимая версия OpenSearch, неверный URI MongoDB, нехватка памяти. Отдельно проверьте буфер сообщений и количество процессоров обработки.
journalctl -u graylog-server -f
mongosh --quiet --eval 'db.runCommand({ping:1})'
grep -E 'message_journal_max_size|processbuffer_processors' /etc/graylog/server/server.conf
Если веб-интерфейс открывается, а поиск пустой, сравните часовой пояс сервера и браузера, затем проверьте, что индекс потока существует. При высоком входящем потоке увеличьте processbuffer_processors и размер журнала сообщений, но не больше, чем позволяет диск.
Итог
Graylog даёт единое окно для логов без покупки коммерческой платформы. Минимальный рабочий набор: сервер, MongoDB, OpenSearch или Data Node, один syslog-вход и поток с ротацией индексов. Дальше добавьте правила нормализации, алерты и резервное копирование конфигурации MongoDB. Проверьте схему на тестовом стенде, и только потом переводите на неё рабочие хосты.