Apache refuse d'écrire dans un fichier journal après avoir supprimé manuellement tout son contenu

9

Pourquoi Apache refuse-t-il d'écrire dans les fichiers journaux (les ErrorLog/ CustomLogceux) après avoir supprimé manuellement leur contenu?

Il n'écrira plus dans ces fichiers journaux qu'après le redémarrage d'Apache.

pourquoi est-ce le cas? Comment puis-je purger un fichier journal en toute sécurité sans avoir à redémarrer Apache?

J'ai Apache 2.2.14 sur Ubuntu 10.04.

AtomicFault
la source
Comment supprimez-vous le contenu?
Dom
@Dom Je l'ouvre avec vim, je fais "dG" (qui supprime tout le contenu), puis je sauvegarde avec "! Wq". La propriété / le groupe / les autorisations ne sont pas modifiées.
AtomicFault
3
@AtomicFault Probablement parce que ce n'est pas comme cela que vous êtes censé faire tourner les journaux Apache . Vous devriez utiliser quelque chose comme logrotatequi envoie un signal de rechargement / redémarrage approprié à Apache (voir la réponse de Pedro ci-dessous). Nickgrim a expliqué le "pourquoi" de l'arrêt de vos journaux - Apache écrit toujours sur l'ancien inode (qui n'est plus connecté au système de fichiers où que vous puissiez y accéder)
voretaq7

Réponses:

14

Je viens de faire un bref test:

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

Notez qu'il vimtesta un numéro d'inode différent après l'avoir modifié, et est donc en fait un fichier différent (bien qu'avec le même nom que l'ancien fichier).

Ainsi, lorsque vous modifiez le fichier avec vim, il supprime l'ancien fichier et en crée un nouveau avec le même nom. Le problème que vous voyez est dû au fait qu'Apache écrit toujours dans l'ancien fichier (supprimé) (vous pouvez le vérifier avec lsof).

Si vous voulez vraiment tronquer un fichier journal, pensez à truncate -s 0 /path/to/file.log(qui semble tronquer sur place)

nickgrim
la source
2
echo> /path/to/file.log fonctionne également
8

Je recommanderais de forcer la rotation des fichiers journaux d' Apache2 avec:

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

Si vous regardez /etc/logrotate.d/apache2, vous verrez que la Apache2configuration doit être rechargée après avoir supprimé son fichier journal avec:

$ sudo /etc/init.d/apache2 reload

Sur Ubuntu, vous pouvez également faire:

$ sudo service apache2 reload
Pedro Romano
la source