Logrotate funktioniert nicht

18

Ich versuche, logrotate dazu zu bringen, an meinem VPS zu arbeiten, um meine Apache-Dateien wöchentlich zu drehen. Derzeit ist der Inhalt der Apache2-Konfigurationsdatei so.

"/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
}

Ich habe es jetzt für zwei Wochen verlassen und nichts hat sich geändert, soweit ich das beurteilen kann. Wenn ich es über die Befehlszeile simuliere, erhalte ich die folgende Ausgabe.

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

Irgendwelche Ideen, was ich falsch konfiguriert habe?

Meine Statusdatei ist auch leer :(

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

Aktualisieren

Ich habe die Statusdatei gelöscht und eine forcierte Ausführung von logrotate durchgeführt. Jetzt sehen die Protokolle so aus, als wären sie gedreht worden, und die Statusdatei sieht vielversprechender aus!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Malachi
quelle

Antworten:

17

Ich denke, das weeklybedeutet, dass logrotate mindestens einen Woche alten Eintrag für Ihre access.log-Datei sehen möchte, um sie zu drehen.

Daher scheint das Problem zu sein, dass Sie den Statuseintrag nicht speichern, um die Rotation auszulösen.


Hier ist ein schrittweises Beispiel für den einfachen Fall, wie Logrotate entscheidet, eine Protokolldatei zu drehen
(dies sind Fedora-Pfade, Ubuntu, Centos usw. können unterschiedlich sein).

(Ich habe ein paar Anfragen gestellt, http://localhostdamit es einige Einträge in access_log gibt, ansonsten dreht sich logrotate nie ...)

Also habe ich mein Logrotate für Apache auf wöchentlich gesetzt;

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

und ursprünglich gibt es keinen Eintrag in der /var/lib/logrotate.statusDatei

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

Logrotate dreht die access_logDatei also nicht ;

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

Jedoch, wenn ich logrotate manuell so laufen lasse;

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

Es gibt jetzt einen Eintrag in der Statusdatei für das httpd access_log.

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

Apache wird das Protokoll jedoch immer noch nicht drehen, da der Eintrag nur 0 Tage alt ist (2012-5-11).

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

Wenn Sie jedoch die Statusdatei mit vi bearbeiten vi /var/lib/logrotate.status, setzen Sie das Datum auf mehr als eine Woche.

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

Dann dreht logrotate die Datei jetzt korrekt, da das Datum in der Statusdatei 2012-4-11mehr als eine Woche von heute zurückliegt2012-5-11

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

(Denken Sie daran, -ddass dies einen Probelauf verursacht und daher nur zur Überprüfung nützlich ist. Sie müssen den Befehl tatsächlich ausführen, ohne -dStatuseinträge vorzunehmen oder Dateien usw. zu drehen.)

Tom H
quelle
1
Die Log-Dateien hatten Einträge, die weit über eine Woche alt waren - es scheint, dass es jetzt funktioniert, aber ich denke, ich werde es in einer Woche herausfinden ...
Malachi
2
Entschuldigung, ich hätte die Antwort klarer formulieren können, aber ich denke, für einen wöchentlichen Wechsel ist ein Eintrag in der Datei /var/lib/logrotate.statusmit einem Datum erforderlich, das mindestens eine Woche alt ist. Ich habe die Antwort mit einem Beispiel aktualisiert ...
Tom H
Vielen Dank für diese klare Erklärung. Ich verstehe die Datumsseite der Dinge vollkommen. Sie drehen sich nur nicht, wenn ich den Befehl manuell aufrufe. Es ist, als würde CRON nicht log rotate aufrufen.
Malachi
Ich bin relativ neu in der Linux-Administration ... In /etc/cron.daily/logrotate/ gibt es: #! / Bin / sh test -x / usr / sbin / logrotate || Ausfahrt 0
Malachi
7
log does not need rotating

Dies kann daran liegen, dass Ihre Protokolldateien leer sind.
Diese Situation kann auftreten, weil Apache weiterhin in eine vorherige Protokolldatei schreibt, die umbenannt wurde, ohne Apache neu zu starten. Also wurde access.log zu access.log.1 und Apache schreibt hinein.

Oder Sie haben ein Problem mit der Erstellungszeit des Protokolls:

ls -al --time=ctime /var/www/user/site.com/logs/
Gregory MOUSSAT
quelle
Sie können die notifemptyZeile auskommentieren, um die 0-Byte-Protokolle zu behandeln, die nicht rotieren. Dann sollten Sie touchvor jedem Test eine neue Protokolldatei erstellen, damit die Logrotate etwas zu drehen hat.
Banjer
6

Ich sah mich einem ähnlichen Problem gegenüber, außer dass mir keine dieser Antworten geholfen hatte. Meine Protokolldatei war riesig und alt, meine Konfiguration war zu 100% in Ordnung und gültig. Das Entfernen der Statusdatei hat nicht geholfen.

Es stellte sich heraus, dass das Problem in doppelten Logrotate-Einträgen lag . Wenn ich logrotate manuell auf meiner Konfigurationsdatei nur so laufen lasse:

logrotate -df /etc/logrotate.d/my_service_name

es wurden keine fehler angezeigt, es hieß nur:

log does not need rotating

Ich weiß immer noch nicht warum. Aber wenn ich einen kompletten Logrotate-Befehl wie diesen ausführe:

logrotate -f /etc/logrotate.conf

Ich habe die folgende Zeile erhalten:

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

Es stellte sich heraus, dass die logrotate-Konfigurationsdatei für meinen Dienst die Einträge für die rotierenden Nginx-Zugriffsprotokolle sowie die Dienstprotokolle selbst enthielt. Und das widersprach der Konfiguration von ngnix logrotate, die eine Regel für alle nginx-Einträge enthält:

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

Die Lösung für meinen Fall ist also ziemlich einfach: Ich musste nur widersprüchliche Nginx-Log- Rotationsregeln aus meiner Konfiguration löschen .

Ich nehme an, dass logrotate nur in einer der neuesten Versionen damit begonnen hat, die Verarbeitung von Dateien bei Regelkonflikten abzubrechen. Ich bekomme diesen Fehler mit v.3.8.7, aber unter v.3.7.8 mit derselben widersprüchlichen Konfiguration wird derselbe Fehler ausgegeben, der sich jedoch in Ordnung dreht. Obwohl ich keine Aufzeichnung davon im logrotate Changelog finden konnte.

Innokenty
quelle
Sie scheinen mit den neuesten Versionen recht zu haben. Ich hatte auch doppelte Einträge; aber beim Laufen logrotate manuell; es hat gut funktioniert. Nachtrückgabewert 0; aber es war nicht richtig gelaufen ...
Chris Maes
2

Versuchen Sie, sudo logrotate -f --verbose /etc/logrotate.d/apache2 das Programm auszuführen. Sehen Sie, was in der Konsole geschrieben ist, und beheben Sie alle Fehler.

Aminah Nuraini
quelle
0

Ich hatte eine Debian 7-Maschine, die nach einem System-Update keine Mail-Protokolle mehr drehte. Alle anderen Protokolle außer den E-Mail-Protokollen wurden korrekt gedreht. Ich stellte fest, dass die Mail-Protokolle um mehrere Gigabyte gewachsen waren. Ich habe die Protokollrotation immer über Webmin verwaltet. Beim Laufen logrotate -d /etc/logrotate.confsah ich die folgende Meldung:

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

Es stellte sich heraus, dass meine Postrotationseinträge in aufgelistet waren /etc/logrotate.d/rsyslog.dpkg-old, was ignoriert wurde! Das Umbenennen der Datei hat die Rotation der Logdatei behoben :-)

Lucaferrario
quelle