Как сделать 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, который затем будет записываться докером по умолчанию (для этого вам не нужно запускать процесс системного журнала в докере). Это намного проще, чем пытаться выяснить, как запустить процесс системного журнала вместе с вашим приложением внутри вашего контейнера докеров (для чего докер, вероятно, в любом случае не предназначен).