Как я могу получить данные из journald и вывести их в logz через rsyslog
У меня есть ряд серверов, которые используют CoreOS. CoreOS изначально использует journald для всех своих файлов журналов. Последний стабильный выпуск включает в себя Docker 1.9, поэтому он еще не поддерживает драйверы журнала Docker.
Изучив несколько вариантов, я думаю, что rsyslog может быть самым простым способом получения логов в logz, так как в документации они указаны в качестве поставщика поддержки журналов.
И я обнаружил, что есть модуль, который позволяет связывать журнал и rsyslog вместе. Итак, используя контейнер, я дал ему попробовать.
В соответствии с документацией к logz я могу отправлять им логи, используя rsyslog, в основном используя следующий конфиг для rsyslogd.conf
# -------------------------------------------------------
# File Logging Directives for Logz.io
# -------------------------------------------------------
$ModLoad imfile
$InputFilePollInterval 10
$PrivDropToGroup adm
$WorkDirectory /var/spool/rsyslog
# File access file:
$InputFileName PATH_TO_FILE
$InputFileTag TYPE:
$InputFileStateFile stat-TYPE
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
$template logzFormatFileTagName,"[SPECIAL_KEY_HERE] <%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [type=TYPE] %msg%\n"
if $programname == 'TYPE' then @@listener.logz.io:5000;logzFormatFileTagName
if $programname == 'TYPE' then ~
Однако, поскольку я не использую файл журнала для ввода, а journald через modimuxsock, я пропустил всю конфигурацию файла журнала и добавил:
$ModLoad imuxsock.so
$OmitLocalLogging off
Я создал простой образ Docker, который запускает rsyslogd. Итак, в конце концов, у меня есть следующий файл конфигурации, и я передаю в сокет команду run -v hostpath: containerpath для сокета journald.
#
# http://www.rsyslog.com/doc/
#
# Input modules
$ModLoad immark.so # provide --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging off
$DebugFile /tmp/rsyslog-debug.log
$DebugLevel 2
$template logzFormatFileTagName,"[SPECIAL_KEY_HERE] <%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [type=docker] %msg%\n"
if $programname == 'docker' then @@listener.logz.io:5000;logzFormatFileTagName
if $programname == 'docker' then ~
Если честно, меня немного смущает настройка TYPE. Я предположил, что должен установить его в dockerd. Как и при запуске journalctl -u unit, где unit - это модуль, который запускает службу в Docker, он показывает, например,
Это правильно?
Мой образ докера запускается с:
docker run --name=logzio-journald -v /run/systemd/journal/syslog:/run/systemd/journal/syslog --rm myregistry.com/logzio-journal-shipper
Последние 30 нечетных строк вывода отладки. Обратите внимание, что когда что-то регистрируется докером, отладка больше не появляется. Ничего не появляется под моей учетной записью logz либо.
8562.569331781:main Q:Reg/w0 : processBATCH: next msg 1: warning: ~ action is deprecated, consider using the 'stop' statement instead [v8.9.0 try http://www.rsyslog.com/e/2307 ]
8562.569337108:main Q:Reg/w0 : IF
8562.569350044:main Q:Reg/w0 : var 'programname'
8562.569370397:main Q:Reg/w0 : ==
8562.569386822:main Q:Reg/w0 : string 'docker'
8562.569412534:main Q:Reg/w0 : eval expr 0x561c9dddcf80, type 'CMP_EQ'
8562.569419072:main Q:Reg/w0 : eval expr 0x561c9dddcf20, type 'V[86]'
8562.569425909:main Q:Reg/w0 : rainerscript: var 17: 'rsyslogd-2307'
8562.569454839:main Q:Reg/w0 : eval expr 0x561c9dddcf20, return datatype 'S'
8562.569463719:main Q:Reg/w0 : eval expr 0x561c9dddcf80, return datatype 'N'
8562.569469502:main Q:Reg/w0 : if condition result is 0
8562.569474698:main Q:Reg/w0 : IF
8562.569487271:main Q:Reg/w0 : var 'programname'
8562.569507498:main Q:Reg/w0 : ==
8562.569523822:main Q:Reg/w0 : string 'docker'
8562.569549617:main Q:Reg/w0 : eval expr 0x561c9dddf780, type 'CMP_EQ'
8562.569556377:main Q:Reg/w0 : eval expr 0x561c9dddefc0, type 'V[86]'
8562.569562533:main Q:Reg/w0 : rainerscript: var 17: 'rsyslogd-2307'
8562.569568453:main Q:Reg/w0 : eval expr 0x561c9dddefc0, return datatype 'S'
8562.569574734:main Q:Reg/w0 : eval expr 0x561c9dddf780, return datatype 'N'
8562.569580401:main Q:Reg/w0 : if condition result is 0
8562.569586028:main Q:Reg/w0 : END batch execution phase, entering to commit phase
8562.569592015:main Q:Reg/w0 : processBATCH: batch of 2 elements has been processed
8562.569598799:main Q:Reg/w0 : regular consumer finished, iret=0, szlog 0 sz phys 2
8562.569606353:main Q:Reg/w0 : DeleteProcessedBatch: we deleted 2 objects and enqueued 0 objects
8562.569612733:main Q:Reg/w0 : doDeleteBatch: delete batch from store, new sizes: log 0, phys 0
8562.569619238:main Q:Reg/w0 : regular consumer finished, iret=4, szlog 0 sz phys 0
8562.569624860:main Q:Reg/w0 : main Q:Reg/w0: worker IDLE, waiting for work.
8562.569640696:7f075a82dab0: thread created, tid 7, name 'in:imuxsock'
8562.569649200:7f075a82dab0: set thread name to 'in:imuxsock'
8562.569665945:imuxsock.c : --------imuxsock calling select, active file descriptors (max 4): 4
8562.569689335:7f075a843ab0: thread created, tid 6, name 'in:immark'
8562.569697227:7f075a843ab0: set thread name to 'in:immark'