Ведение журнала с помощью Docker и Kubernetes. Разделение бревен более 16к

Я использую версию Docker 17.12.1-ce Kubernetes verision v1.10.11

Мое приложение выводит журнал в формате Json на консоль. Одно из полей - stackTrace, которое может включать в себя огромный stackTrace.

Проблема в том, что сообщение журнала разделено на два сообщения. Итак, если я посмотрю на / var / lib / docker / container / ... .log, я вижу два сообщения. Я читал, что это сделано из соображений безопасности, но не совсем понимаю, что с этим делать?

Должен ли я сократить свой stackTrace? Или подгонять размер? Это разрешено? Это правильный способ решения этой проблемы?

p / s Я использую драйвер логирования json-файла


person liotur    schedule 22.04.2020    source источник


Ответы (1)


Это ожидаемое поведение. Docker разделяет сообщения журнала размером 16 КБ из-за буфера размером 16 КБ для сообщений журнала. Если длина сообщения превышает 16 КБ, оно должно быть разделено регистратором файлов json и объединено в конечной точке.

Он отмечает журнал как частичное сообщение, но действительно зависит от драйвера / службы для повторной сборки.

Docker Docs упоминает, что существуют различные поддерживаемые драйверы.

С вашей архитектурой (Stacktraces) json-driver может быть не лучшим вариантом.

И я нашел эту ветку на github, которая добавляет дополнительную информацию по теме (а также как много оффтопа).

Редактировать.

Архитектура ведения журнала говорит, что все, что контейнерное приложение записывает в stdout и stderr, обрабатывается и перенаправляется куда-то контейнерным движком.

Движок контейнера Docker перенаправляет эти два потока драйверу ведения журнала, который настроен в Kubernetes для записи в файл в формате json.

Примечание. Драйвер ведения журнала Docker json обрабатывает каждую строку как отдельное сообщение. Еще одна особенность заключается в том, что при использовании драйвера ведения журнала Docker нет прямой поддержки многострочных сообщений. Вам необходимо обрабатывать многострочные сообщения на уровне агента ведения журнала или выше.

Я действительно не понимаю, что я могу с этим сделать?

Это ограничение на размер Docker. Вот еще одно хорошее обсуждение, которое заканчивается идеей использования filebeat / fluentd.

Похоже, что вариант Docker_mode для Fluentbit может помочь, но Я не уверен, как именно вы разбираете журналы контейнеров.

Должен ли я сократить свой stackTrace?

Это зависит от того, нужны ли вам следы в журналах или нет.

Или подгонять размер? Я искал какую-то «ручку» для настройки на стороне Docker и на данный момент не могу найти ни одной.

Похоже, что единственное решение для этого - использовать какой-нибудь инструмент обработки журналов, который может комбинировать линии разделения.

person Nick    schedule 23.04.2020
comment
Да, я это знаю, я уже читал этот документ. Это мне не особо помогает. - person liotur; 23.04.2020