Apache weigert sich, in eine Protokolldatei zu schreiben, nachdem ich den gesamten Inhalt manuell gelöscht habe

9

Warum weigert sich Apache, in Protokolldateien (die ErrorLog/ CustomLogdiejenigen) zu schreiben, nachdem ich deren Inhalt manuell gelöscht habe?

Es wird erst wieder in diese Protokolldateien geschrieben, nachdem ich Apache neu gestartet habe.

Warum ist das so? Wie kann ich eine Protokolldatei sicher löschen, ohne Apache neu starten zu müssen?

Ich habe Apache 2.2.14 unter Ubuntu 10.04.

AtomicFault
quelle
Wie löscht man den Inhalt?
Dom
@ Dom Ich öffne es einfach mit vim, mache "dG" (wodurch der gesamte Inhalt gelöscht wird) und speichere dann mit "! Wq". Der Besitz / die Gruppe / die Berechtigungen werden nicht geändert.
AtomicFault
3
@AtomicFault Wahrscheinlich, weil Sie Apache-Protokolle nicht so drehen sollen . Sie sollten so etwas verwenden, logrotatedas ein geeignetes Reload / Restart-Signal an Apache sendet (siehe Pedros Antwort unten). Nickgrim behandelte das "Warum" hinter dem Stoppen Ihrer Protokolle - Apache schreibt immer noch in den alten Inode (der nicht mehr mit dem Dateisystem verbunden ist, wo immer Sie ihn erreichen können)
voretaq7

Antworten:

14

Ich habe gerade einen kurzen Test gemacht:

$ echo vim test > vimtest
$ ls -i vimtest
35149 vimtest
$ vim vimtest
<dG, :wq>
$ ls -i vimtest
35148 vimtest

Beachten Sie, dass vimtestdiese nach dem Bearbeiten eine andere Inode-Nummer hat und daher tatsächlich eine andere Datei ist (wenn auch mit demselben Namen wie die alte Datei).

Wenn Sie die Datei mit vim bearbeiten, wird die alte Datei gelöscht und eine neue mit demselben Namen erstellt. Das Problem, das Sie sehen, wird dadurch verursacht, dass Apache immer noch in die alte (gelöschte) Datei schreibt (Sie können dies überprüfen lsof).

Wenn Sie eine Protokolldatei wirklich abschneiden möchten, ziehen Sie dies in Betracht truncate -s 0 /path/to/file.log(die anscheinend direkt abgeschnitten wird).

Nickgrim
quelle
2
echo> /path/to/file.log funktioniert auch
8

Ich würde empfehlen, die Rotation der Apache2- Protokolldateien zu erzwingen mit:

$ sudo logrotate -f /etc/logrotate.d/apache2

Wenn Sie sich das ansehen /etc/logrotate.d/apache2, werden Sie feststellen, dass die Apache2Konfiguration nach dem Löschen der Protokolldatei neu geladen werden muss mit:

$ sudo /etc/init.d/apache2 reload

Unter Ubuntu können Sie alternativ Folgendes tun:

$ sudo service apache2 reload
Pedro Romano
quelle