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

9

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

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

Tentei recarregar o rsyslog, enviar um sinal HUP e reiniciá-lo completamente, mas nada funcionou.

As únicas maneiras de descobrir que realmente funcionavam eram sujas:

  • interrompa o serviço, exclua os arquivos estatísticos do rsyslog e inicie o rsyslog novamente. Tudo isso em um gancho pós-rotação no meu arquivo de logrotate.
  • kill -9 rsyslog e inicie novamente.

Existe uma maneira adequada de fazer isso sem tocar nos 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
Informações sobre $ InputFileSeverity
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# Encaminhar para servidor remoto
se $ syslogtag contiver 'apache-' @ @ my_server: 5000; WithoutTimeFormat
: syslogtag, contém, "apache-" ~

*. * @@ my_server: 5000; SyslFormat

Arquivo de logrotate

/home/user/my_app/shared/log/*.log {
  diariamente
  missingok
  dateext
  girar 30
  comprimir
  notifempty
  extensão gz
  copytruncate
  criar 640 usuário usuário
  sharedscripts
  pós-rotação
    (interrompa rsyslog && rm / var / spool / rsyslog / stat- * && start rsyslog 2> & 1) || verdade
  final
}

Para sua informação, 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 sendo rastreados corretamente.

Estou executando o Ubuntu 12.04.

Vincent B.
fonte

Respostas:

8

O problema estava realmente vindo do logrotate.

Basicamente, com a minha configuração, executando unicorn, não preciso usar a copytruncatediretiva. (que é o que causa problemas aqui)

USR1 - Reabra todos os logs pertencentes ao processo de trabalho. Veja Unicorn :: Util.reopen_logs para o que é considerado um log. Os arquivos de log não são reabertos até que seja concluída o processamento da solicitação atual, portanto, várias linhas de log para uma solicitação (como feita pelo Rails) não serão divididas em vários 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
}
Vincent B.
fonte
Se estas são cópias diretas do seu arquivo, acho que o seu problema foi que você estava usando post-rotate(o que não é uma coisa) em vez de postrotate, porque o script original de logrotate que você tinha deveria ter funcionado bem com o rsyslog (se o script pós-rotativo estivesse em execução ) ...?
mltsy
2
Não me lembro quando, mas mudei post-rotatepara lastaction. Seu comentário ainda é muito sensato e pode ter resolvido meu problema na época :). Para o registro, porém, evitarei usar copytruncateno futuro de qualquer maneira, porque é lento e brinca com identificadores de arquivo.
Vincent B.
2

Seu arquivo logrotate contém uma entrada para /home/user/shared/log/*.log, que não corresponde ao seu arquivo de log /home/user/my_app/shared/log/unicorn.stderr.log. Você precisa adicionar uma entrada de logrotate para esse diretório e garantir que ela contenha copytruncate- como está, o rsyslog renomeia o arquivo atual e cria um novo e o imfile continua seguindo a manipulação de arquivo do arquivo agora renomeado.

Jenny D
fonte
Desculpe, o nome do arquivo é apenas um erro de digitação. No entanto, copytruncate pode ser um bom ponto. Deixe-me apenas olhar para aquele :).
Vincent B.