Pracuję na Ubuntu 14 z domyślnym narzędziem rsyslog i logrotate.
W domyślnej /etc/logrotate.d/rsyslog
konfiguracji logrotate rsyslog widzę:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Z tego, co rozumiem, zaleca się stosowanie copytruncate we wszystkich scenariuszach logrotate, ponieważ nie przenosi on bieżącego dziennika, ale raczej obcina dziennik, aby każdy proces z otwartym programem obsługi plików mógł nadal do niego pisać.
Skąd więc domyślna konfiguracja korzystająca z funkcji przeładowywania rsyslog?
Mówiąc jako autor rsyslog, copytruncate jest w rzeczywistości bardzo, bardzo, bardzo złym wyborem. Jest z natury ostrożny, a korzystanie z niego jest prawie gwarancją utraty danych dziennika. Im częściej plik jest zapisywany, tym więcej stracisz. I to nie jest tylko część ostatniej linii, ale może być kilkaset, w zależności od dokładnego czasu i stanu systemu w momencie obrotu.
Po przeniesieniu pliku i utworzeniu nowego i-węzła (pliku) rsyslog śledzi poprzedni plik i kończy przetwarzanie. Więc w tym przypadku nie poniesiesz żadnych strat. Gwarantowane (chyba że odmontujesz system plików ...).
Na temat „reopenOnTruncate”: osobiście widziałem, że reopenOnTruncate jest również racjonalny pod innymi względami, szczególnie w przypadku NFS i tym podobnych. Jakiś czas temu całkowicie usunąłem tę funkcję, ale później przekonałem się do ponownego włączenia podobnej funkcjonalności. Pozostanie ona „eksperymentalna” najprawdopodobniej na zawsze, ponieważ naprawdę wiem, że ludzie mają problemy w bardzo mocno obciążonych systemach. „copytruncate” po prostu nie jest przyzwoitym trybem do pracy z plikami dziennika.
Obecnie pracuję nad plikiem refaktoryzacji (ETA 8.34 lub 8.35). Refaktoryzowana wersja prawdopodobnie będzie w stanie zapobiec przypadkowemu ponownemu wysłaniu z powodu wyścigu API, ale także nie będzie w stanie uchronić się przed utratą danych - ponieważ jest to koncepcyjnie niemożliwe.
źródło
Zależy to całkowicie od tego, jak proces zapisuje dzienniki.
copytruncate
działa tylko wtedy, gdy komunikaty dziennika są dołączane do pliku (npwhatever >> logfile
.I nie wtedy, gdy przekierowuje dane wyjściowe (np
whatever > logfile
.).źródło
Od wersji 8.16 rsyslog ma opcję imfile,
reopenOnTruncate
która obsługuje problem copytruncte.źródło
W przypadku rsyslog prawdopodobnie bardziej sensowne jest pozostawienie rzeczy takimi, jakie są.
Podstawowym powodem jest to, że rsyslog ma wewnętrzne kolejki, których może używać w przypadkach, gdy jego uchwyt wyjściowy staje się niedostępny.
Przeładowanie a) spowoduje, że rsyslog odtworzy swój własny plik dziennika, i b) spowoduje, że wszelkie zdarzenia w kolejce zostaną opróżnione do pliku podczas tworzenia.
Możliwe, że copytruncate nie wyrządza szkody (chociaż martwi mnie to, że częściowo napisane linie są obcinane), ale zwykle uważam, że kopiowanie / usuwanie / przeładowywanie jest „bezpieczniejsze” z punktu widzenia integralności.
Jak wspomniał @ faker , ponieważ rsyslog może obsłużyć sytuację, w której jego plik staje się niedostępny, nie ma ważnego powodu, aby użyć copytruncate.
I jak wspomniano w @ SelivanovPavel , rsyslog faktycznie wymaga konkretnej konfiguracji, aby poprawnie poradzić sobie z obcinaniem kopii.
Więc choćby dlatego, że zastosowanie tego
reload
podejścia wymaga mniejszego odchylenia od domyślnej konfiguracji, zatrzymałbym to.źródło