Как сделать syslog работающим в докере?

Мое приложение будет отправлять сообщения syslog local0. Когда я переместил свое приложение в докер, я обнаружил, что трудно показать системный журнал.

Я попытался запустить docker как --log-dirver как syslog или journald, оба работают странно, /var/log/local0.log показывает вывод консоли для контейнера docker вместо системного журнала моего приложения, когда я пытаюсь выполнить эту команду внутри контейнер

logger -p local0.info -t a message

Итак, я пытаюсь установить syslog-ng внутри контейнера Docker. Внешний блок док-станции - Arch Linux (ядро 4.14.8 + systemctl). Контейнер Docker работает как CentOS 6. Если я устанавливаю syslog-ng внутри контейнера и запускаю его, он показывает следующее сообщение.

# yum install -y syslog-ng  # this will install syslog-ng 3.2.5
# /etc/init.d/syslog-ng start
Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql'
Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql'
Error opening file for reading; filename='/proc/kmsg', error='Operation not permitted (1)'
Error initializing source driver; source='s_sys', id='s_sys#0'
Error initializing message pipeline;

4 ответа

Решение

CentOS 6:

1.

Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' 
Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql'

Вы можете исправить вышеуказанную ошибку, установив syslog-ng-libdbi пакет:

yum install -y syslog-ng-libdbi

2.

Error opening file for reading; filename='/proc/kmsg', error='Operation not permitted (1)'
Error initializing source driver; source='s_sys', id='s_sys#0'
Error initializing message pipeline;

поскольку syslog-ng не имеет прямого доступа к сообщениям ядра, вам необходимо отключить (прокомментировать) это в его конфигурации:

sed -i 's|file ("/proc/kmsg"|#file ("/proc/kmsg"|g' /etc/syslog-ng/syslog-ng.conf

CentOS 7:

1.

Error opening file for reading; filename='/proc/kmsg', error='Operation not permitted (1)'

system() Источник находится в конфигурации по умолчанию. Этот источник автоматически читает специфичные для платформы источники и читает /dev/kmsg в Linux, если ядро ​​версии 3.5 или новее. Итак, нам нужно отключить (комментарий) system() Исходный код в файле конфигурации:

sed -i 's/system()/# system()/g' /etc/syslog-ng/syslog-ng.conf

2. Когда мы запускаем его в режиме переднего плана syslog-ng -F мы получаем следующее:

# syslog-ng -F
syslog-ng: Error setting capabilities, capability management disabled; error='Operation not permitted'

Итак, нам нужно бежать syslog-ng как root, без поддержки возможностей:

syslog-ng --no-caps -F

У меня также были проблемы с получением стандартного вывода "syslog" из моего приложения после того, как оно было докеризовано.

Я атаковал проблему с другой стороны. Я хотел получить системные журналы контейнера на хосте /var/log/syslog

Я запустил свой контейнер с дополнительным креплением /dev/log устройство и вуаля это работало как шарм.

docker run -v /dev/log:/dev/log  sysloggingapp:latest

Другой способ - настроить централизованное ведение журнала с помощью сервера syslog / rsyslog, а затем использовать драйвер док-станции syslog для ведения журнала. Синтаксис для использования в командной строке запуска Docker:

$ docker run --log-driver=syslog \
--log-opt syslog-address=udp://address:port image-name

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

замещать image-name с именем вашего приложения Docker.

Готовое изображение док-станции rsyslog доступно по https://github.com/jumanjihouse/docker-rsyslog

Ссылки: Docker Logging на docker.com,

Интерфейс командной строки Docker, https://www.aquasec.com/wiki/display/containers/Docker+Containers+vs.+Virtual+Machines

Для тех, кто попытается понять это в будущем,

Лучший способ, который я нашел, - просто установить флаг LOG_PERROR в openlog(). Таким образом, ваш системный журнал будет печататься в stderr, который затем будет записываться докером по умолчанию (для этого вам не нужно запускать процесс системного журнала в докере). Это намного проще, чем пытаться выяснить, как запустить процесс системного журнала вместе с вашим приложением внутри вашего контейнера докеров (для чего докер, вероятно, в любом случае не предназначен).

Другие вопросы по тегам