Como posso extrair dados de journald e enviá-los para logz via rsyslog

1

Eu tenho vários servidores que usam o CoreOS. O CoreOS usa nativamente o journald para todos os seus arquivos de log. A versão estável mais recente incorpora o docker 1.9, de modo que ainda não oferece suporte a drivers de log do docker.

Depois de explorar vários caminhos, acho que o rsyslog pode ser a maneira mais fácil de obter logs no logz, pois ele está listado como um remetente de log de suporte em sua documentação.

E eu descobri que há um módulo que permite vincular journal e rsyslog juntos. Então, usando um contêiner eu dei uma chance.

De acordo com a documentação do logz eu posso enviar logs para eles usando o rsyslog usando basicamente a seguinte configuração para o 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 ~

No entanto, porque eu não estou usando um arquivo de log para entrada, mas o journald via modimuxsock eu omiti toda a configuração do arquivo de log e adicionei:

$ModLoad imuxsock.so 
$OmitLocalLogging off

Eu criei uma imagem simples do Docker que executa o rsyslogd. Então, no final eu tenho o seguinte como um arquivo de configuração e eu passo no soquete via docker run -v hostpath: containerpath para o socket 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 ~

Para ser honesto, estou um pouco confuso com a configuração TYPE. Eu assumi que deveria estar configurando para dockerd. Como quando você executa journalctl -u unit, Where unit é uma unidade que executa um serviço sob o docker, ele mostra a exibição, por exemplo,

Isso está correto?

Minha imagem do docker está sendo executada com:

docker run --name=logzio-journald -v /run/systemd/journal/syslog:/run/systemd/journal/syslog --rm myregistry.com/logzio-journal-shipper

Últimas 30 linhas ímpares de saída de depuração: Observe que, quando algo é registrado pela janela de encaixe, não há mais depuração. Nada aparece sob minha conta de 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'
    
por Matt 14.04.2016 / 06:38

0 respostas