Encaminhando logs específicos rsyslog

1

TL; DR - envia logs específicos com rsyslog (para um servidor redis): como selecionar os logs a serem enviados?

Eu quero encaminhar para um servidor redis um conjunto ( e somente esse conjunto ) de logs, digamos, por exemplo, logs nginx em /var/log/nginx/*.log . Para isso, eu estava pensando em usar um rsyslog facilidade (local7 no meu exemplo). No entanto:

  • Não posso processar apenas os local7.* logs para o servidor redis: Eu recebo todos os logs do sistema (auth, authpriv, cron, local7 também, etc.)
  • Não consigo processar todos os registros de um diretório (por exemplo: /var/log/nginx/*.log não funciona, mas /var/log/nginx/some-access.log será enviado para meu servidor redis pelo rsyslog. Como obter todos os registros de um diretório?)

A configuração tem três módulos em uso e envia logs do local7 para o meu servidor redis desta maneira:

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 me deparei.

Configuração 1 (sugestão de configuração comum):

$InputFileName /var/log/nginx/*.log
$InputFileTag nginx
$InputFileFacility local7
$InputRunFileMonitor

Config 2 (sintaxe diferente - a 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 saída 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 omhiredis de módulo (para saída para o Redis)
  • Debian 8

Nota

Se eu simplesmente remover a config 1 ou config 2 e usar authpriv.* @redis_ip:port , por exemplo, ainda receberei todos os logs (portanto, logs de facility syslog, cron, auth, authpriv, etc.) como se o authpriv. * em authpriv.* @redis_ip:port não tivesse impacto no rsyslog.

Eu inicio o rsyslog com /usr/local/sbin/rsyslog -f /etc/rsyslog.conf e verifico com a opção -N1 diz que está tudo correto.

As perguntas que eu verifiquei não mudaram nada para mim:

por Bamse 20.04.2016 / 12:45

1 resposta

0

Já que finalmente consegui algo funcionar e provavelmente sei onde foi meu erro, aqui está uma resposta para minha própria pergunta:

$ModLoad imuxsock # provides support for local system logging
$ModLoad omhiredis # support for sending to Redis
$ModLoad imfile # For tailing files

if $syslogtag == "nginx:" then {
  action(
    name="rsyslog_redis"
    server="redis_ip"
    port="redis_port"
    type="omhiredis"
    mode="queue"
    key="rsyslog_redis" # we need the same key in Logstash's config
    template="jsonlines"  # use the JSON template defined below
  )
}

input(
  type="imfile"
  File="/var/log/nginx/access.log"
  Tag="nginx:"
)

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. Foi, portanto, enviando todos os logs. Isso explica minha primeira nota na pergunta em que authpriv.* @redis_ip:port não mudaria nada.

Answer: action (..) enviará logs, mesmo que nenhum servidor esteja definido nele, portanto, coloque-o nas instruções if para escolher quais logs serão encaminhados.

Observação: eu não adicionei o modelo "jsonlines" à configuração, pois é possível encontrá-lo facilmente na Internet e isso exige algum espaço desnecessário aqui.

    
por 21.04.2016 / 10:55