Wie vermeide ich, dass Apache neu geladen wird, wenn Protokolle gedreht werden?

25

Ich benutze logrotate, um Apache Access-, Error- und Rewrite-Logs zu rotieren. Meine Konfigurationsdatei sieht folgendermaßen aus:

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

Mein Problem ist, dass Apache bei jeder Rotation neu geladen werden muss, da Apache nicht mehr in die gerade gedrehte Logdatei schreibt. Gibt es eine Möglichkeit, zu vermeiden, dass Apache jedes Mal neu geladen wird, wenn eine Rotation ausgeführt wird?

Harfe
quelle

Antworten:

42

Der Grund, warum Apache neu geladen werden muss, ist, dass nach dem Öffnen einer Datei ein Dateihandle darauf abgelegt wird und weiterhin in dieses Dateihandle geschrieben wird. Wenn Sie die Datei verschieben, wird dies nicht angezeigt, sondern es wird weiterhin in dasselbe Handle geschrieben. Beim erneuten Laden wird die Datei erneut geöffnet und ein neues Handle abgerufen.

Um das erneute Laden zu vermeiden, können Sie die Datei kopieren und die alte Datei leeren, anstatt sie zu verschieben. Auf diese Weise kann Apache weiterhin in dasselbe Dateihandle schreiben. Dazu fügen Sie der logrotate-Konfigurationsdatei die Option "copytruncate" wie folgt hinzu:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
Jenny D
quelle
Danke für deine Antwort. Also denke ich, wenn ich lastaction echo "" | /apache/*log endscriptdas Dateihandle hinzufüge, ist es nicht "verloren"?
Harfe
3
Entschuldigung, ich hätte "copytruncate" anstelle von "copy" sagen sollen. Dann brauchst du die Lastaction-Sache überhaupt nicht. Ich beschuldige mich, zu viel Blut in meinem Koffeinstrom zu haben :-)
Jenny D
Funktioniert wie ein Zauber :)
Harfe
4
@harp sei vorsichtig, logrotatesagt doc: "Beachten Sie, dass es eine sehr kurze Zeitspanne zwischen dem Kopieren und dem Abschneiden der Datei gibt, sodass möglicherweise einige Protokolldaten verloren gehen."
Totor
Abgesehen von der Möglichkeit, dass einige Daten verloren gehen, gibt es noch andere bekannte Nachteile bei der Verwendung copytruncate?
Leo Galleguillos
5

Ich empfehle Ihnen, http://cronolog.org/ zu verwenden

So benutze ich es:

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
quelle
1
Das Weiterleiten an ein externes Programm kann ein Problem sein, wenn viel Datenverkehr zum Webserver besteht. Aber es vermeidet ordentlich das Problem mit dem Dateihandle.
Jenny D
Sieht nach einer guten Alternative aus. Komprimiert cronolog on-the-fly?
Harfe
Es gibt eine ähnliche App "rotatelogs" im apache2-utils-Paket. Achten Sie nur darauf, nicht von verschiedenen virtuellen Apache-Servern in dieselbe Protokolldatei zu "leiten" - diese stapfen aufeinander.
Arie Skliarouk