Назад | Перейти на главную страницу

Как я могу извлечь данные из journald и вывести их в logz через rsyslog

У меня есть несколько серверов, использующих CoreOS. CoreOS изначально использует journald для всех файлов журналов. Последний стабильный выпуск включает docker 1.9, поэтому он еще не поддерживает драйверы журнала докеров.

После изучения нескольких возможностей, я думаю, что 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 ~

Однако, поскольку я не использую файл журнала для ввода, а журнал через modimuxsock, я пропустил всю конфигурацию файла журнала и добавил:

$ModLoad imuxsock.so 
$OmitLocalLogging off

Я создал простой образ Docker, который запускает rsyslogd. Итак, в конце у меня есть следующий файл конфигурации, и я передаю сокет через docker 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 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'