TL;DR - enviar logs específicos com rsyslog (para um servidor redis): como selecionar os logs a serem enviados?
Desejo encaminhar para um servidor redis um conjunto ( e somente esse conjunto ) de logs, digamos, por exemplo, nginx logs in /var/log/nginx/*.log
. Para isso, pensei em usar um recurso rsyslog ( local7 no meu exemplo). No entanto :
- Não consigo processar apenas os
local7.*
logs para o servidor redis: recebo todos os logs do sistema (auth, authpriv, cron, local7 também, etc.) - Não consigo processar todos os logs de um diretório (por exemplo:
/var/log/nginx/*.log
não funcionará, mas/var/log/nginx/some-access.log
será enviado ao meu servidor redis por rsyslog. Como obter todos os logs de um diretório então?)
A configuração tem três módulos em uso e envia logs do local7 para o meu servidor redis desta forma:
local7.* @redis_ip:port
$ModLoad imuxsock # provides support for local system logging
$ModLoad omhiredis # support for sending to Redis
$ModLoad imfile # For tailing files
Os outros dois blocos de código são duas maneiras diferentes de configurar o rsyslog que encontrei.
Configuração 1 (configuração comum que as pessoas sugerem):
$InputFileName /var/log/nginx/*.log
$InputFileTag nginx
$InputFileFacility local7
$InputRunFileMonitor
Config 2 (sintaxe diferente - aquela que encontrei na documentação do rsyslog para a versão 8.16.0):
input(
type="imfile"
File="/var/log/nginx/*.log"
Tag="nginx:"
Facility="local7"
)
Para enviar para redis:
action(
name="rsyslog_redis"
type="omhiredis"
mode="queue"
key="rsyslog_redis_key"
template="jsonlines" # use a JSON template defined below
)
- Rsyslog 8.16.0, construído a partir de fontes com módulo omhiredis (para saída para Redis)
- Debian 8
Observação
Se eu simplesmente remover a configuração 1 ou a configuração 2 e usar authpriv.* @redis_ip:port
, por exemplo, ainda obterei todos os logs (portanto, logs da instalação syslog, cron, auth, authpriv, etc.) como se authpriv.* authpriv.* @redis_ip:port
não tivesse impacto no rsyslog.
Eu inicio o rsyslog /usr/local/sbin/rsyslog -f /etc/rsyslog.conf
e verifico com a opção -N1 diz que está tudo correto.
As perguntas que verifiquei não mudaram nada para mim:
Como finalmente consegui algo funcionando e provavelmente sei onde estava meu erro, aqui está uma resposta para minha própria pergunta:
permite-me enviar nginx access.log e apenas aqueles para o meu servidor redis.
Meu erro veio da ação do bloco ( .. ) que não foi limitada pela instrução if. Estava, portanto, enviando todos os logs. Isso explica minha primeira nota na pergunta onde
authpriv.* @redis_ip:port
não mudaria nada.Resposta: action( .. ) enviará logs, mesmo que nenhum servidor esteja definido nele, então coloque-o entre instruções if para escolher quais logs serão encaminhados.
Observação: não adicionei o modelo "jsonlines" à configuração, pois é fácil encontrá-lo na Internet e ocupa um espaço desnecessário aqui.