O Rsyslog pára de enviar dados para o servidor remoto após a rotação do log

9

Na minha configuração, eu tenho rsyslog que é responsável por seguir as alterações de /home/user/my_app/shared/log/unicorn.stderr.log usando imfile . O conteúdo é enviado para outro servidor de log remoto usando TCP.

Quando o arquivo de log gira, o rsyslog pára de enviar dados para o servidor remoto.

Eu tentei recarregar o rsyslog, enviando um sinal HUP e reiniciando-o completamente, mas nada funcionou.

As únicas maneiras que eu pude encontrar que realmente funcionavam eram sujas:

  • interrompa o serviço, exclua os arquivos de stat do rsyslog e inicie o rsyslog novamente. Tudo isso em um gancho postrotate no meu arquivo logrotate.
  • kill -9 rsyslog e inicie-o novamente.

Existe uma maneira correta para que eu faça isso sem tocar nos componentes internos do rsyslog?

arquivo Rsyslog

$ModLoad immark
$ModLoad imudp
$ModLoad imtcp
$ModLoad imuxsock
$ModLoad imklog
$ModLoad imfile

$template WithoutTimeFormat,"[environment] [%syslogtag%] -- %msg%"

$WorkDirectory /var/spool/rsyslog

$InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$InputFileTag unicorn-stderr
$InputFileStateFile stat-unicorn-stderr
$InputFileSeverity info
$InputFileFacility local8
$InputFilePollInterval 1
$InputFilePersistStateInterval 1
$InputRunFileMonitor

# Forward to remote server
if $syslogtag contains 'apache-' then @@my_server:5000;WithoutTimeFormat
:syslogtag, contains, "apache-" ~

*.* @@my_server:5000;SyslFormat

Arquivo de logrotate

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  copytruncate
  create 640 user user
  sharedscripts
  post-rotate
    (stop rsyslog && rm /var/spool/rsyslog/stat-* && start rsyslog 2>&1) || true
  endscript
}

FYI, o arquivo é legível para o usuário do rsyslog, meu servidor está acessível e outros arquivos de log que não rodam no mesmo ciclo continuam a ser rastreados corretamente.

Estou executando o Ubuntu 12.04.

    
por Vincent B. 21.10.2013 / 11:45

2 respostas

8

O problema estava vindo do logrotate.

Basicamente, com minha configuração, executando unicórnio, não preciso usar a diretiva copytruncate . (que é o que causa problemas aqui)

USR1 - Reopen all logs owned by the worker process. See Unicorn::Util.reopen_logs for what is considered a log. Log files are not reopened until it is done processing the current request, so multiple log lines for one request (as done by Rails) will not be split across multiple logs.

Isso começou a funcionar corretamente após a atualização para esta configuração:

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  create 640 user user
  sharedscripts

  post-rotate
    # Telling Unicorn to reload files
    test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"

    # Reloading rsyslog telling it that files have been rotated
    reload rsyslog 2>&1 || true
  endscript
}
    
por 29.10.2013 / 12:24
2

Seu arquivo logrotate contém uma entrada para /home/user/shared/log/*.log , que não corresponde ao seu arquivo de log em /home/user/my_app/shared/log/unicorn.stderr.log . Você precisa adicionar uma entrada logrotate para esse diretório e certificar-se de que ela contém copytruncate - como está, o rsyslog está renomeando o arquivo atual e criando um novo, e o imfile continua seguindo o filehandle do arquivo agora renomeado. >     

por 21.10.2013 / 12:10