:::: MENU ::::

Rsyslog stops working after logrotateRsyslog ne fonctionne plus après un logrotate

  • May 27 / 2015
  • 0

Rsyslog stops working after logrotateRsyslog ne fonctionne plus après un logrotate

You are using an RSyslog mechanism to send your logs to a centralized server, but as soon as the logrotate is executed on the server, no log is sent anymore?
I will explain here why this can happen and how to fix it properly.

In logrotate, when rotation is happening the old file is renamed and a new file is created. But some processes do not care about the filename change and keep their file descriptor on the older file (whatever the name/extension is). To avoid that kind of problem, you need to use copytruncate option in logrotate so this process can start writing to the new file.

Due to his previous option copytruncate, logrotate is working fine, but rsyslog doesn’t understand that the file has changed (truncated) and is acting like a tail -f command staying stuck on this truncated state and not sending logs anymore…

To avoid that, you have to specify a lastscript option when logrotate has been executed to renew the rsyslog spool and state of the file.

As an example, here is how a logrotate script could look like to be working fine in such a case:

The “rm /var/spool/rsyslog/MyApp-*” line has to be adapted depending on the InputFileStateFile name you used in your rsyslog configuration.Vous utilisez un mécanisme RSyslog pour envoyer vos logs à un serveur centralisé, mais dès que logrotate est exécuté sur le serveur, plus aucun log n’est envoyé?
Je vais expliquer ici pourquoi ceci peut arriver et comment corriger le problème correctement.

Dans logrotate, lorsque la rotation survient, l’ancien fichier est renommé et un nouveau fichier est créé. Mais certains processus ne se préoccupent pas du changement du nom de fichier et conservent leur descripteur de fichier sur l’ancien fichier (peu importe le nom/extension). Pour éviter ce genre de problème, vous devez utiliser l’option copytruncate dans logrotate afin que ce processus puisse commencer à écrire dans le nouveau fichier.

A cause de l’option précédente copytruncate, logrotate fonctionne correctement, mais rsyslog ne comprend pas que le fichier a changé (tronqué) et agit comme une commande tail -f en restant bloqué sur l’état tronqué et en n’envoyant plus aucun log…

Pour éviter cela, vous devez spécifier une option lastscript lorsque logrotate a été exécuté pour renouveler le spool rsyslog et l’état du fichier.

Comme exemple, voici à quoi pourrait ressembler un script logrotate pour bien fonctionner dans un cas de ce genre :

La ligne “rm /var/spool/rsyslog/MyApp-*” doit bien sûr être adaptée selon le nom InputFileStateFile que vous avez utilisé dans votre configuration rsyslog.

Comments are closed.

Question ? Contact