Rsyslog cesse d'envoyer des données au serveur distant après la rotation du journal

9

Dans ma configuration, j'ai rsyslog qui est en charge de suivre les changements d' /home/user/my_app/shared/log/unicorn.stderr.logutilisation imfile. Le contenu est envoyé à un autre serveur de journalisation distant à l'aide de TCP.

Lorsque le fichier journal tourne, rsyslog cesse d'envoyer des données au serveur distant.

J'ai essayé de recharger rsyslog, d'envoyer un signal HUP et de le redémarrer complètement, mais rien n'a fonctionné.

Les seuls moyens que j'ai pu trouver qui fonctionnaient réellement étaient sales:

  • arrêtez le service, supprimez les fichiers statistiques rsyslog et redémarrez rsyslog. Tout cela dans un crochet postrotate dans mon fichier logrotate.
  • kill -9 rsyslog et recommencez.

Existe-t-il un moyen approprié de le faire sans toucher aux composants internes de rsyslog?

Fichier rsyslog

$ ModLoad immark
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
Imfile $ ModLoad

$ template WithoutTimeFormat, "[environnement] [% 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

# Transférer au serveur distant
si $ syslogtag contient 'apache-' alors @@ mon_serveur: 5000; WithoutTimeFormat
: syslogtag, contient, "apache-" ~

*. * @@ mon_serveur: 5000; SyslFormat

Fichier Logrotate

/home/user/my_app/shared/log/*.log {
  du quotidien
  missingok
  dateext
  tourner 30
  compresse
  notifempty
  extension gz
  copiertronquer
  créer 640 utilisateur utilisateur
  sharedscripts
  post-rotation
    (arrêter rsyslog && rm / var / spool / rsyslog / stat- * && démarrer rsyslog 2> & 1) || vrai
  script de fin
}

Pour info, le fichier est lisible pour l'utilisateur rsyslog, mon serveur est accessible et d'autres fichiers journaux qui ne tournent pas sur le même cycle continuent d'être suivis correctement.

J'utilise Ubuntu 12.04.

Vincent B.
la source

Réponses:

8

Le problème venait en fait de logrotate.

Fondamentalement, avec ma configuration, exécutant unicorn, je n'ai pas besoin d'utiliser la copytruncatedirective. (ce qui cause des problèmes ici)

USR1 - Rouvrez tous les journaux appartenant au processus de travail. Voir Unicorn :: Util.reopen_logs pour ce qui est considéré comme un journal. Les fichiers journaux ne sont pas rouverts tant que le traitement de la demande en cours n'est pas terminé, de sorte que plusieurs lignes de journal pour une demande (comme cela est fait par Rails) ne seront pas réparties sur plusieurs journaux.

Cela a commencé à fonctionner correctement après la mise à jour de cette configuration:

/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.
la source
S'il s'agit de copies directes de votre fichier, je pense que votre problème était en fait que vous utilisiez post-rotate(ce qui n'est pas une chose) au lieu de postrotate, car ce script logrotate d'origine que vous aviez aurait dû fonctionner correctement avec rsyslog (si le script postrotate avait été en cours d'exécution) ) ...?
mltsy
2
Je ne me souviens pas quand, mais j'ai changé post-rotatepour lastaction. Votre commentaire est toujours très sensé et il a peut-être résolu mon problème à l'époque :). Pour mémoire cependant, je vais éviter de l'utiliser copytruncateà l'avenir de toute façon car il est lent et joue avec les poignées de fichier.
Vincent B.
2

Votre fichier logrotate contient une entrée pour /home/user/shared/log/*.log, qui ne correspond pas à votre fichier journal /home/user/my_app/shared/log/unicorn.stderr.log. Vous devez ajouter une entrée logrotate pour ce répertoire et vous assurer qu'il contient copytruncate- tel quel, rsyslog renomme le fichier actuel et en crée un nouveau, et imfile continue de suivre le descripteur de fichier du fichier maintenant renommé.

Jenny D
la source
Désolé, le nom de fichier n'est qu'une faute de frappe. Cependant, copytruncate peut être un bon point. Permettez-moi de regarder celui-ci :).
Vincent B.