Logrotate ne fonctionne pas

18

J'essaie de faire fonctionner logrotate sur mon VPS pour faire tourner mes fichiers apache chaque semaine. Actuellement, le contenu du fichier de configuration apache2 est tel quel.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

Je l'ai laissé depuis deux semaines maintenant et rien n'a changé pour autant que je sache. Lorsque je le simule à partir de la ligne de commande, j'obtiens la sortie suivante.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

Des idées sur ce qu'Iv'e a mal configuré?

Mon fichier d'état est également vide :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Mise à jour

J'ai supprimé le fichier d'état et j'ai effectué une exécution forcée de logrotate et maintenant les journaux semblent avoir été tournés et le fichier d'état semble plus prometteur!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Malachie
la source

Réponses:

17

Je pense que cela weeklysignifie que logrotate veut voir au moins une entrée d'une semaine pour votre fichier access.log afin de le faire pivoter.

Par conséquent, le problème semble être que vous ne stockez pas l'entrée d'état pour déclencher la rotation.


Voici un exemple pas à pas du cas simple, de la façon dont logrotate décide de faire tourner un fichier journal
(ce sont des chemins Fedora, Ubuntu, Centos, etc. peuvent être différents)

(J'ai fait quelques requêtes pour http://localhostqu'il y ait quelques entrées dans access_log, sinon logrotate ne tourne jamais ...)

J'ai donc réglé mon logrotate pour apache sur hebdomadaire comme ça;

/var/log/httpd/*log {
        weekly
...
}

et à l'origine il n'y a pas d'entrée dans le /var/lib/logrotate.statusfichier

# grep access_log /var/lib/logrotate.status
<- nothing

Logrotate ne fait donc pas pivoter le access_logfichier;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

Cependant, si j'exécute logrotate manuellement comme ça;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

il y a maintenant une entrée dans le fichier d'état pour httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

Cependant, apache ne va toujours pas faire tourner le journal, car l'entrée n'a que 0 jours (2012-5-11);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

Cependant, si vous modifiez le fichier d'état avec vi vi /var/lib/logrotate.statusdonc quelque chose comme ça pour régler la date à plus d'une semaine ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Ensuite, logrotate fait maintenant pivoter correctement le fichier car la date dans le fichier d'état 2012-4-11se trouve il y a plus d'une semaine à partir d'aujourd'hui2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(gardez à l'esprit que la -dcause d'un run à sec, n'est donc utile que pour l'inspection, vous devez réellement exécuter la commande sans -dfaire des entrées d'état ou faire pivoter les fichiers, etc.)

Tom H
la source
1
Les fichiers journaux avaient des entrées datant de plus d'une semaine - Il semblerait que cela fonctionne maintenant, mais je suppose que je le découvrirai dans une semaine ...
Malachi
2
Désolé, j'aurais pu être plus clair dans la réponse, mais je pense que pour une rotation hebdomadaire, il faut une entrée dans le fichier /var/lib/logrotate.statusavec une date d'au moins une semaine. J'ai mis à jour la réponse avec un exemple ...
Tom H
Merci pour une explication si claire - je comprends parfaitement le côté date des choses, c'est juste qu'elles ne tournent pas à moins que j'appelle manuellement la commande ... C'est comme si CRON n'appelait pas log rotation?
Malachi
Je suis relativement nouveau dans l'administration Linux ... Dans /etc/cron.daily/logrotate/ il y a: #! / Bin / sh test -x / usr / sbin / logrotate || sortie 0
Malachi
7
log does not need rotating

Cela peut être dû au fait que vos fichiers journaux sont vides.
Cette situation peut se produire car apache écrit toujours dans un fichier journal précédent, qui a été renommé sans redémarrer apache. Ainsi, access.log est devenu access.log.1 et apache y écrit.

Ou vous avez un problème avec l'heure de création du journal:

ls -al --time=ctime /var/www/user/site.com/logs/
Gregory MOUSSAT
la source
Vous pouvez commenter la notifemptyligne pour gérer les journaux de 0 octet qui ne tournent pas. Ensuite, vous voudrez touchun nouveau fichier journal avant chaque test afin que logrotate ait quelque chose à faire pivoter.
Banjer
6

J'ai rencontré le même problème, sauf qu'aucune de ces réponses ne m'a aidé. Mon fichier journal était énorme et ancien, ma configuration était 100% correcte et valide, la suppression du fichier d'état n'a pas aidé.

Il s'est avéré que le problème était dans les entrées de rotation de journal en double . Lorsque j'exécute logrotate manuellement sur mon fichier de configuration uniquement comme ça:

logrotate -df /etc/logrotate.d/my_service_name

il n'a montré aucune erreur, il a juste dit:

log does not need rotating

Je ne sais toujours pas pourquoi en fait. Mais quand j'exécute une commande logrotate complète comme ça:

logrotate -f /etc/logrotate.conf

J'ai eu la ligne suivante:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Il s'est avéré que le fichier de configuration logrotate pour mon service contenait les entrées pour la rotation des journaux d'accès nginx ainsi que les journaux de service lui-même. Et cela était en conflit avec la configuration ngnix logrotate, qui a une règle pour toutes les entrées nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

La solution pour mon cas est donc assez simple: je viens de supprimer la règle de rotation des journaux nginx en conflit dans ma configuration .

Je suppose que logrotate a commencé à abandonner le traitement du fichier sur les conflits de règles uniquement à partir de l'une des versions les plus récentes. J'obtiens cette erreur avec v.3.8.7 mais sous v.3.7.8 avec la même configuration conflictuelle, il écrit la même erreur mais tourne bien. Bien que je n'ai pu trouver aucune trace de cela dans le journal des modifications logrotate.

Innokenty
la source
vous semblez avoir raison sur les versions les plus récentes. J'ai également eu des entrées en double; mais lors de l'exécution de logrotate manuellement; cela a très bien fonctionné. La valeur de retour de nuit 0; mais ça ne s'était pas passé correctement ...
Chris Maes
2

Essayez d'exécuter sudo logrotate -f --verbose /etc/logrotate.d/apache2 Voir ce qui est écrit dans la console et corrigez tout ce qui ne va pas.

Aminah Nuraini
la source
0

J'avais une machine Debian 7 qui, après une mise à jour du système, ne faisait plus tourner les journaux de messagerie. Tous les autres journaux, sauf ceux du courrier, ont été correctement tournés. J'ai découvert que les journaux de messagerie avaient augmenté de plusieurs gigaoctets. J'ai toujours géré la rotation des journaux via Webmin. Puis, en cours d'exécution, logrotate -d /etc/logrotate.confj'ai vu le message suivant:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

Il est apparu que mes entrées de rotation du courrier étaient répertoriées /etc/logrotate.d/rsyslog.dpkg-old, ce qui a été ignoré! Renommer le fichier a corrigé la rotation du fichier journal :-)

lucaferrario
la source