Как сделать системный журнал работоспособным в докере?

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

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

logger -p local0.info -t a message

Итак, я пытаюсь установить syslog-ng внутри контейнера докеров. Внешний док-бокс — это 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;

person Daniel YC Lin    schedule 26.12.2017    source источник
comment
У нас есть серия сообщений в блогах о запуске syslog-ng в докере, которые могут быть полезны: syslog-ng.com/blog/central-log-server-docker   -  person Robert Fekete    schedule 29.03.2018


Ответы (3)


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
person nickgryg    schedule 02.01.2018
comment
для CentOS 7 этот метод не может работать, потому что /proc/kmsg не существует в /etc/syslog-ng/syslog-ng.conf - person Daniel YC Lin; 27.07.2018
comment
ссылка: stackoverflow.com/questions/51550624/, главное - заменить system() на unix-stream("/dev/log") - person Daniel YC Lin; 31.07.2018

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

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

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

docker run -v /dev/log:/dev/log  sysloggingapp:latest
person Ben Hirschberg    schedule 04.11.2018
comment
работает!) спасибо за идею смонтировать /dev/log хоста в /dev/log контейнера - person Arthur Sult; 17.05.2021

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

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

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

Замените image-name именем образа докера вашего приложения.

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

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

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

person Aby Sheffer    schedule 15.01.2018