У докера есть возможность указать диспетчер логов. По умолчанию —
json-file, то есть, докер складывает вывод из контейнера в json-file
на хосте. Если мы выбираем диспетчер логов, который будет отправлять записи
куда-то по сети, то мы больше не сможем использовать команду docker logs.
Если stdout/stderr контейнера был выбран единственным местом для записи
логов приложения, то в случае сетевых проблем или проблем у единого хранилища,
быстро извлечь записи для дебага может не получиться.
Мы можем использовать json-file докера и Filebeat. Получим и локальные
логи и дальнейшую маршрутизацию. Стоит заметить здесь ещё одну особенность
докера. При записи события длиной больше 16KB докер разбивает запись символом \n,
что путает многие сборщики логов. Об этом есть issue.
Проблему со стороны докера решить не удалось, поэтому её решили со стороны
сборщиков. С некоторой версии Filebeat поддерживает такое
поведение докера и корректно объединяет события.
Проверил и получилось, но не так как хотелось бы (данные не разбиваются по полям, следовательно такое не получится агрегировать потом в кибане):
Еще из минусов, логи находятся в странных директориях: /var/lib/docker/containers/*/*-json.log
Из плюсов, можно добавлять доп. информацию из env-переменных:
version: '2.1'
services:
web:
image: hello-world/web:latest
container_name: api
ports:
- "80:8080"
logging:
driver: "json-file"
options:
max-size: 10m
max-file: "3"
labels: "production_status"
env: "os"
labels:
production_status: "testing"
environment:
- os=ubuntu
Больше деталей можно узнать тут »
В итоге, у меня появилась идея, а может сделать stdout и stderr middleware, и тут надо посмотреть на logspout
Если logspout работает в самом контейнере, то вы увидите его mount /var/lib/docker/containers как том.
Комментарии
Комментариев пока нет.