Jak uniknąć przeładowania apache podczas obracania dzienników?

25

Korzystam z logrotate, aby obracać dzienniki dostępu, błędów i przepisywania Apache. Mój plik konfiguracyjny wygląda następująco:

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

Mój problem polega na tym, że za każdym razem, gdy dochodzi do rotacji, Apache musi zostać ponownie załadowany, ponieważ Apache nie zapisuje więcej w właśnie obróconym pliku dziennika. Czy istnieje sposób na uniknięcie przeładowania Apache za każdym razem, gdy logrotate wykonuje obrót?

harfa
źródło

Odpowiedzi:

42

Powodem, dla którego apache wymaga przeładowania, jest to, że po otwarciu pliku pobiera do niego uchwyt pliku i kontynuuje zapisywanie do tego uchwytu pliku. Kiedy przenosisz plik, nie widzi tego, po prostu pisze do tego samego uchwytu. Po ponownym załadowaniu plik otworzy się ponownie i uzyska nowy uchwyt.

Aby uniknąć ponownego załadowania, zamiast przenosić plik, możesz go skopiować i opróżnić stary plik. W ten sposób apache może kontynuować zapis do tego samego uchwytu pliku. Robisz to, dodając opcję „copytruncate” do pliku konfiguracyjnego logrotate, w następujący sposób:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
Jenny D.
źródło
Dzięki za odpowiedź. Więc myślę, że kiedy dodam lastaction echo "" | /apache/*log endscriptuchwyt pliku nie jest „zgubiony”?
harfa
3
Przepraszam, powinienem był powiedzieć „copytruncate” zamiast „copy”. Więc w ogóle nie potrzebujesz rzeczy związanej z ostatnią aktywnością. Obwiniam za dużo krwi w moim strumieniu kofeiny :-)
Jenny D.
Działa jak urok :)
harfa
4
@harp bądź ostrożny, logrotatedoc mówi: „Zauważ, że jest bardzo mały przedział czasu między kopiowaniem pliku a jego obcinaniem, więc niektóre dane logowania mogą zostać utracone”.
Totor
Poza możliwością utraty niektórych danych, czy są jakieś inne znane wady copytruncate?
Leo Galleguillos
5

Polecam użyć http://cronolog.org/

Tak to wykorzystuję:

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
Borys Iwanow
źródło
1
Przesyłanie potokowe do dowolnego programu zewnętrznego może stanowić problem, jeśli na serwerze jest duży ruch. Ale starannie unika się problemu z uchwytem pliku.
Jenny D.
Wygląda na dobrą alternatywę. Czy cronolog kompresuje w locie?
harfa
W pakiecie apache2-utils znajduje się podobna aplikacja „rotatelogs”. Uważaj tylko, aby nie „potokować” do tego samego pliku dziennika z różnych serwerów wirtualnych Apache - będą się ze sobą tupać.
Arie Skliarouk