Apache odmawia zapisu do pliku dziennika po ręcznym usunięciu całej jego zawartości

9

Dlaczego Apache odmawia zapisywania do plików dziennika (tych ErrorLog/ CustomLognich) po ręcznym usunięciu ich zawartości?

Nie zapisze się ponownie w tych plikach dziennika, dopóki nie zrestartuję Apache.

Dlaczego tak jest? Jak mogę bezpiecznie wyczyścić plik dziennika bez konieczności ponownego uruchamiania Apache?

Mam Apache 2.2.14 na Ubuntu 10.04.

AtomicFault
źródło
Jak usuwasz zawartość?
Dom
@Dom Po prostu otwieram go za pomocą vima, robię „dG” (który usuwa całą zawartość), a następnie zapisuję za pomocą „! Wq”. Własność / grupa / uprawnienia nie są zmieniane.
AtomicFault,
3
@AtomicFault Prawdopodobnie dlatego, że nie tak należy obracać dzienniki Apache . Powinieneś używać czegoś takiego, logrotateco wysyła odpowiedni sygnał przeładowania / ponownego uruchomienia do Apache (patrz odpowiedź Pedro poniżej). Nickgrim opisał „dlaczego” zatrzymywanie dzienników - Apache wciąż pisze do starego i-węzła (który nie jest już podłączony do systemu plików, gdzie można go dostać)
voretaq7

Odpowiedzi:

14

Właśnie zrobiłem krótki test:

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

Zauważ, że vimtestma inny numer i-węzła po jego edycji, a zatem jest w rzeczywistości innym plikiem (choć o tej samej nazwie co stary plik).

Kiedy więc edytujesz plik za pomocą vima, usuwa on stary plik i tworzy nowy o tej samej nazwie. Problem, który widzisz, jest spowodowany tym, że Apache nadal zapisuje do starego (usuniętego) pliku (możesz to sprawdzić za pomocą lsof).

Jeśli naprawdę chcesz obciąć plik dziennika, zastanów się truncate -s 0 /path/to/file.log(który wydaje się obcinać w miejscu)

nickgrim
źródło
2
echo> /path/to/file.log również działa
8

Polecam wymuszanie rotacji plików dziennika Apache2 za pomocą:

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

Jeśli spojrzysz /etc/logrotate.d/apache2, zobaczysz, że Apache2konfiguracja musi zostać ponownie załadowana po usunięciu pliku dziennika za pomocą:

$ sudo /etc/init.d/apache2 reload

W systemie Ubuntu możesz alternatywnie:

$ sudo service apache2 reload
Pedro Romano
źródło