Obracaj plik, który jest cały czas otwarty i zapisywany

10

Mam aplikację linux, która stale zapisuje informacje logowania do pliku dziennika, np. /var/log/application.log. Ponieważ aplikacja nie obraca pliku automatycznie, ten plik dziennika może osiągnąć rozmiar gigabajtów w ciągu kilku tygodni, więc chcę mieć możliwość prawidłowego obracania tego pliku

Moją główną obawą jest to, że aby zawsze obracać plik otwierany przez aplikację, prawdopodobnie będę musiał:

  1. Przenieś plik do jego obróconej postaci /var/log/application.log -> /var/log/application.log.2013-01-28

  2. Utwórz pusty /var/log/application.log. Obs: W tym momencie proces aplikacji wciąż pisze/var/log/application.log.2013-01-28

  3. Zmień deskryptor pliku procesu aplikacji, aby wskazywał ponownie /var/log/application.log

Więc mam rację? Jeśli tak, jak mogę to zrobić? (głównie zmiana części deskryptora pliku)

Jeśli nie, jaki jest właściwy sposób i jak to zrobić?

Bruno Polaco
źródło
Czy chcesz wyczyścić plik, czy po prostu go obrócić?
ewwhite
Jaką aplikację? Aplikacja musi zapewnić wsparcie, aby zrobić to poprawnie. (W przeciwnym razie możesz zrobić coś bardzo brzydkiego - dołącz do procesu, otwórz nowy plik, dup2nowy deskryptor nad starym, a następnie zamknij nowy deskryptor.)
David Schwartz
Ciekawe podejście Schwartz. Jestem ciekawa, jak to działa, i będę się z tym bawić. W każdym razie aplikacja jest w domu i szukam bardziej ogólnego rozwiązania. Podoba mi się odpowiedź Kormoca btw
Bruno Polaco
@ewwhite Muszę go obracać, nie mogę sobie pozwolić na utratę danych dziennika
Bruno Polaco

Odpowiedzi:

11

Napisz logrotatekonfigurację do użyciacopytruncate

copytruncate
    Truncate the original log file in place after creating a copy, instead of moving the 
    old log file and optionally creating a new one. It can be used when some program
    cannot be told to close its logfile and thus might continue writing (appending) to
    the previous log file forever. Note that there is a very small time slice between
    copying the file and truncating it, so some logging data might be lost. When this
    option is used, the create option will have no effect, as the old log file stays
    in place.
RS
źródło
Interesujące, obcięcie pliku po skopiowaniu wydaje się dość sprytne, nawet z marginesem utraty danych. Nie zauważyłem tej opcji na logrotate. Dzięki za wgląd :)
Bruno Polaco
1

Większość takich aplikacji reaguje na sygnał, na przykład SIGHUP, i zamyka i ponownie otwiera swoje pliki dziennika po otrzymaniu sygnału. Sprawdź dokumentację aplikacji pod kątem prawidłowego sygnału do wysłania.

Michael Hampton
źródło
A jeśli nie, możesz ponownie uruchomić aplikację jako rezerwową. Tak zwykle robi syslog i wiele innych programów.
lsd