Logstash+Gelf Docker logs
GELF(The Graylog Extended Log Format) - это формат лога, который помогает избегать недостатки стандартного Syslog:
- увеличивает стандартную длину сообщения syslog 1024 байта;
- доступна прямая интеграция с приложениями(мы используем Symphony+Gelf);
- отсутствие типов сообщений как Syslog “Facilities”;
- Каждое сообщение лога в GELF содержит поля: (host, timestamp, version, message, custom fields).
GELF разработан для Graylog - мощная платформа с открытым исходным кодом для управления структурированными и неструктурированными данными, а также для отладки приложений. Graylog в сочетании с MongoDB и Elasticsearch часто сравнивают с ELK (Elasticsearch, Logstash и Kibana). Оба решения дают возможность решать похожие задачи(сбор, хранение, анализ логов).
Пример лога Gelf в JSON:
{
"version": "1.1",
"host": "example.org",
"short_message": "A short message that helps you identify what is going on",
"full_message": "Backtrace here\n\nmore stuff",
"timestamp": 1385053862.3072,
"level": 1,
"_user_id": 9001,
"_some_info": "foo",
"_some_env_var": "bar"
}
Для того, что бы не беспокоиться о тайм-аутах, проблемах с подключением, которое может сломать ваше приложение, GELF может использовать UDP.
Пример UDP Input Gelf для Logstah:
input {
gelf {
use_udp => true
port_udp => 12201
}
}
Docker поддержка Gelf
Docker поддерживает gelf log driver, что дает возможность удобно мониторить приложение Docker с помощью Graylog, Logstash, Fluentd.
Контейнеры, логи которых мы хотим видеть в ELK или Graylog, должны иметь конфигурацию лога:
logging:
driver: gelf
options:
gelf-address: udp://logstash.server:12201
Если вы запускаете docker вместо docker-compose:
docker run --log-driver gelf --log-opt gelf-address=udp://logstash.server:12201
Для удобного форматирования можно добавить tag:
logging:
options:
tag: staging
Пример лога:
{
"_index": "containers-stage-2022.01.30",
"_type": "_doc",
"_id": "veAKq34BrClNybG_pVzt",
"_score": 1,
"_source": {
"level": 3,
"source_host": "57.190.13.124",
"type": "dockerstage",
"message": "127.0.0.1 - 30/Jan/2022:14:51:48 +0200 \"GET /index.php\" 400",
"host": "storage-px62-fsn1",
"@version": "1",
"version": "1.1",
"image_name": "containers/stage-service:stage",
"@timestamp": "2022-01-30T12:51:48.742Z",
"container_id": "90bda0ee69a266ff0d066340dd4265b3a04aafca9514178d76e7baf5f6a67952",
"tag": "stage-lms-service",
"container_name": "service-02",
"image_id": "sha256:f7da54deee7649be2a1e6b89a8695d394adc5c34650de775891ff845a4b596a9",
"created": "2022-01-28T20:54:10.727435635Z",
"command": "/usr/bin/supervisord -n -c /etc/supervisord.conf"
}