Собираем логи из docker в GrayLog
Последнее время я все чаще стал ходить на сервера и смотреть логи руками. Но доккер так устроен, что найти что-то в логах крайне сложно. В результате я пришел к выводу, что пора собирать логи где-то в ElasticSearch.
Классический ELK я не очень люблю, а потому стал искать варианты, которые мне бы понравились. В итоге, пришел к GrayLog.
Оставался вопрос сборщика логов, для отправки их в GrayLog, который сложит их в ElasticSearch.
Перебрал кучку малую и остановился на Logspout. Он умеет отправлять логи в syslog, GELF и, что не маловажно, он умеет multiline logs. Т.е. Tracebacks будут не построчно, а целиком, как положено.
Ну что ж, поднимаем.
Начнем с GrayLog. Поднимаем с помощью docker-compose:
version: '3'
services:
mongodb:
image: mongo:4.1
container_name: mongodb
restart: always
volumes:
- mongodata:/data/db:rw
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.2
container_name: elasticsearch
restart: always
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data:rw
graylog:
image: graylog/graylog:3.1
container_name: graylog
restart: always
environment:
- GRAYLOG_PASSWORD_SECRET=$uperP00perPa$$sw0rd
# Password: admin
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
- GRAYLOG_HTTP_EXTERNAL_URI=http://graylog.example.com:9000/
- GRAYLOG_TRANSPORT_EMAIL_ENABLED=true
- GRAYLOG_TRANSPORT_EMAIL_HOSTNAME=smtp.gmail.com
- GRAYLOG_TRANSPORT_EMAIL_PORT=587
- GRAYLOG_TRANSPORT_EMAIL_USE_AUTH=true
- GRAYLOG_TRANSPORT_EMAIL_USE_TLS=true
- GRAYLOG_TRANSPORT_EMAIL_AUTH_USERNAME=noreply@example.com
- GRAYLOG_TRANSPORT_EMAIL_AUTH_PASSWORD=password
- GRAYLOG_TRANSPORT_EMAIL_SUBJECT_PREFIX=[graylog]
- GRAYLOG_TRANSPORT_EMAIL_FROM_EMAIL=noreply@example.com
links:
- mongodb:mongo
- elasticsearch
depends_on:
- mongodb
- elasticsearch
ports:
# HTTP
- 9000:9000
# Syslog TCP
- 1514:1514
# Syslog UDP
- 1514:1514/udp
# GELF TCP
- 12201:12201
# GELF UDP
- 12201:12201/udp
volumes:
esdata1:
driver: local
mongodata:
driver: local
Не забудьте подправить переменные окружения.
Теперь логинимся в сам GrayLog и настраиваем входящий поток. Для этого переходим в System - Input
и выбираем из выпадающего списка Syslog UDP
, нажимаем Launch new input
. Откроется окно настроек. Нас интересует всего две вещи:
- Global - включаем ее
- Port - должен быть 1514
Нажимаем Save
и после этого поток должен запуститься и начать слушать входящие данные.
Осталось добавить сборщик логов Logspout
. Кусок docker-compose.yml:
logspout:
image: gliderlabs/logspout:latest
container_name: logspout
restart: always
volumes:
- /etc/hostname:/etc/host_hostname:ro
- /var/run/docker.sock:/var/run/docker.sock
command:
multiline+syslog://graylog:1514
Применяем:
docker-compose up -d
После этого в GrayLog должны пойти логи. Просто перейдите на страницу Search
и вы их увидите.
Комментарии: