Faire pivoter un fichier ouvert et en cours d'écriture à tout moment

10

J'ai une application Linux qui écrit continuellement des informations de journalisation dans un fichier journal, par exemple. /var/log/application.log. Comme l'application ne fait pas pivoter le fichier automatiquement, ce fichier journal peut atteindre une taille de gigaoctets en quelques semaines, donc je veux pouvoir faire pivoter ce fichier correctement

Ma principale préoccupation ici est que pour faire pivoter un fichier ouvert par l'application à tout moment, je devrai probablement:

  1. Déplacer le fichier vers sa forme pivotée /var/log/application.log -> /var/log/application.log.2013-01-28

  2. Créez un vide /var/log/application.log. Obs: à ce stade, le processus de candidature écrit toujours/var/log/application.log.2013-01-28

  3. Modifiez le descripteur de fichier du processus de demande pour revenir à /var/log/application.log

Alors, ai-je raison? Si oui, comment faire? (principalement la modification de la partie descripteur de fichier)

Si je ne le suis pas, quelle est la bonne façon et comment le faire?

Bruno Polaco
la source
Avez-vous besoin d'effacer le fichier ou simplement de le faire pivoter?
ewwhite
Quelle application? L'application doit fournir un support pour le faire correctement. (Sinon, vous pouvez faire une chose très moche - attachez-vous au processus, ouvrez le nouveau fichier, dup2le nouveau descripteur sur l'ancien, puis fermez le nouveau descripteur.)
David Schwartz
Approche intéressante Schwartz. Je suis curieux de voir cela en action et je vais jouer avec ça un moment. Quoi qu'il en soit, l'application est en interne et je cherche une solution plus générale. J'aime la réponse de kormoc btw
Bruno Polaco
@ewwhite J'ai besoin de le faire pivoter, je ne peux pas me permettre de perdre les données du journal
Bruno Polaco

Réponses:

11

Écrivez une logrotateconfig à utilisercopytruncate

copytruncate
    Truncate the original log file in place after creating a copy, instead of moving the 
    old log file and optionally creating a new one. It can be used when some program
    cannot be told to close its logfile and thus might continue writing (appending) to
    the previous log file forever. Note that there is a very small time slice between
    copying the file and truncating it, so some logging data might be lost. When this
    option is used, the create option will have no effect, as the old log file stays
    in place.
RS
la source
Intéressant, tronquer le fichier après la copie semble assez intelligent, même avec la marge de perte de données. Je n'ai pas remarqué cette option sur logrotate. Thx pour la perspicacité :)
Bruno Polaco
1

La plupart de ces applications répondent à un signal, tel que SIGHUP, et fermeront et rouvriront leurs fichiers journaux à la réception du signal. Consultez la documentation de votre application pour le bon signal à envoyer.

Michael Hampton
la source
Et si ce n'est pas le cas, vous pouvez redémarrer l'application comme solution de rechange. C'est ce que fait habituellement syslog, et pas mal d'autres programmes.
lsd