Comment éviter le rechargement d'Apache lors de la rotation des journaux?

25

J'utilise logrotate pour faire pivoter les journaux d'accès, d'erreur et de réécriture d'Apache. Mon fichier de configuration ressemble à ceci:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

Mon problème est que chaque fois qu'une rotation se produit, Apache doit être rechargé car Apache n'écrit plus dans le fichier journal qui vient de pivoter. Existe-t-il un moyen d'éviter les rechargements d'Apache à chaque fois que logrotate effectue une rotation?

harpe
la source

Réponses:

42

La raison pour laquelle apache a besoin d'un rechargement est qu'une fois qu'il a ouvert un fichier, il reçoit un descripteur de fichier et continue d'écrire dans ce descripteur de fichier. Lorsque vous déplacez le fichier, il ne le voit pas, il continue d'écrire dans la même poignée. Lorsque vous effectuez un rechargement, il ouvrira à nouveau le fichier et obtiendra une nouvelle poignée.

Pour éviter le rechargement, au lieu de déplacer le fichier, vous pouvez le copier et vider l'ancien fichier. De cette façon, apache peut continuer à écrire dans le même descripteur de fichier. Pour ce faire, ajoutez l'option "copytruncate" au fichier de configuration logrotate, comme ceci:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
Jenny D
la source
Merci pour votre réponse. Donc, je suppose que lorsque j'ajoute lastaction echo "" | /apache/*log endscriptle descripteur de fichier n'est pas "perdu"?
harpe
3
Désolé, j'aurais dû dire "copytruncate" au lieu de "copy". Ensuite, vous n'avez pas du tout besoin de la dernière action. Je reproche d'avoir trop de sang dans mon flux de caféine :-)
Jenny D
Fonctionne comme un charme :)
harpe
4
@harp soyez prudent, logrotatedit le doc: "Notez qu'il y a un très petit intervalle de temps entre la copie du fichier et sa troncature, donc certaines données de journalisation peuvent être perdues."
Totor
Outre la possibilité que certaines données soient perdues, y a-t-il d'autres inconvénients connus à utiliser copytruncate?
Leo Galleguillos
5

Je vous recommande d'utiliser http://cronolog.org/

Voici comment je l'utilise:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined
Boris Ivanov
la source
1
Le piping vers n'importe quel programme externe peut être un problème s'il y a beaucoup de trafic vers le serveur Web. Mais cela évite parfaitement le problème de gestion de fichiers.
Jenny D
Ressemble à une bonne alternative. Cronolog se comprime-t-il à la volée?
harpe
Il existe une application similaire "rotatelogs" dans le paquet apache2-utils. Faites juste attention à ne pas "canaliser" dans le même fichier journal à partir de différents serveurs virtuels apache - ils se piétineront.
Arie Skliarouk