logrotate nie kompresuje / var / log / messages

11

Z biegiem czasu zauważyłem pewne dzienniki w /var/logtakich jak auth, kerni messagesbyły coraz ogromne. Zrobiłem logrotatewpisy do nich:

$ cat /etc/logrotate.d/auth.log 
/var/log/kern.log {
    rotate 5
    daily
}
$ cat /etc/logrotate.d/kern.log 
/var/log/kern.log {
    rotate 5
    daily
}
$ cat /etc/logrotate.d/messages 
/var/log/messages {
    rotate 5
    daily
    postrotate
        /bin/killall -HUP syslogd
    endscript
}

mam też compresswłączoną opcję:

$ grep compress /etc/logrotate.conf 
# uncomment this if you want your log files compressed
compress

Działa to wielkie dla auth.log, kern.logi innych, co oznacza, że każdy z tych dzienników jest skompresowane i obracany, z ostatnich 5 dni dzienników zachowana. /var/log/messagesjednak nie jest kompresowany, co powoduje, że dzienniki są dłuższe niż 5 dni:

$ ls /var/log/messages*
/var/log/messages           /var/log/messages-20100213
/var/log/messages-20100201  /var/log/messages-20100214
/var/log/messages-20100202  /var/log/messages-20100215
/var/log/messages-20100203  /var/log/messages-20100216
/var/log/messages-20100204  /var/log/messages-20100217
/var/log/messages-20100205  /var/log/messages-20100218
/var/log/messages-20100206  /var/log/messages-20100219
/var/log/messages-20100207  /var/log/messages-20100220
/var/log/messages-20100208  /var/log/messages-20100221
/var/log/messages-20100209  /var/log/messages-20100222
/var/log/messages-20100210  /var/log/messages-20100223
/var/log/messages-20100211  /var/log/messages-20100224
/var/log/messages-20100212

Jak wyjaśniono w innym logrotatepytaniu dotyczącym ServerFault , stare dzienniki (najprawdopodobniej) nie są usuwane, ponieważ końce plików są różne dla każdego pliku. Wydaje się, że dzieje się tak, ponieważ pliki nie są gzipowane.

Co mogę zrobić, aby /var/log/messagesskompresować i obrócić, zachowując ostatnie 5 dni dzienników, tak jak wszystkie inne pliki dzienników? czego mi brakuje?

EDYCJA 1 : dodatkowe informacje zgodnie z żądaniem w pierwszych kilku odpowiedziach.

Używam Gentoo Linux. Mój /etc/logrotate.confplik:

$ cat /etc/logrotate.conf 
# $Header: /var/cvsroot/gentoo-x86/app-admin/logrotate/files/logrotate.conf,v 1.3 2008/12/24 20:49:10 dang Exp $
#
# Logrotate default configuration file for Gentoo Linux
#
# See "man logrotate" for details
# rotate log files weekly
weekly
#daily
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
compress
# packages can drop log rotation information into this directory
include /etc/logrotate.d
notifempty
nomail
noolddir
# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

/etc/logrotate.d zawiera moje niestandardowe pliki konfiguracyjne, jak wspomniano powyżej, wraz z konfiguracjami mysql, rsync itp. zainstalowanymi przez te pakiety.

Mój katalog główny crontabjest pusty:

$ sudo crontab -l
no crontab for root

Sprawdziłem wszystko pod /etc/cron.{daily,hourly,monthly,weekly}kątem syslog, i jest skrypt, który się obraca /var/log/syslogi /var/log/auth.log.

Następnie utworzyłem /var/log/messagestylko logrotateplik konfiguracyjny, zgodnie z sugestią CarpeNoctem:

$ cat logrotate-messages 
weekly
rotate 4
create
dateext
compress
notifempty
nomail
noolddir
/var/log/messages {
    rotate 5
    daily
    postrotate
        /bin/killall -HUP syslogd
    endscript
}

Następnie uruchomiłem logrotateręcznie:

$ logrotate -d logrotate-messages -f
reading config file logrotate-messages
reading config info for /var/log/messages 

Handling 1 logs

rotating pattern: /var/log/messages  forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/messages
  log needs rotating
rotating log /var/log/messages, log->rotateCount is 5
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/messages to /var/log/messages-20100224
creating new /var/log/messages mode = 0644 uid = 0 gid = 0
running postrotate script
running script with arg /var/log/messages : "
        /bin/killall -HUP syslogd
"
compressing log with: /bin/gzip
$ which gzip
/bin/gzip
$ file /bin/gzip
/bin/gzip: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

Zgodnie z powyższym dziennikiem logrotateskompresowałem dziennik za pomocą / bin / gzip, ale nie widzę pliku skompresowanych wiadomości /var/log. Również globowanie dla starych obróconych plików nie powiodło się.

EDYCJA 2 : dodanie danych wyjściowych debugowania logrotatepo dodaniu .gzsufiksu do starych /var/log/message-*plików.

Zaczynamy od:

$ ls /var/log/messages*
/var/log/messages              /var/log/messages-20100222.gz
/var/log/messages-20100219.gz  /var/log/messages-20100223.gz
/var/log/messages-20100220.gz  /var/log/messages-20100224.gz
/var/log/messages-20100221.gz

Następnie uruchom logrotatenasz niestandardowy plik konfiguracyjny:

$ logrotate -d logrotate-messages -f
reading config file logrotate-messages
reading config info for /var/log/messages 

Handling 1 logs

rotating pattern: /var/log/messages  forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/messages
  log needs rotating
rotating log /var/log/messages, log->rotateCount is 5
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
removing /var/log/messages-20100219.gz
removing old log /var/log/messages-20100219.gz
destination /var/log/messages-20100224.gz already exists, skipping rotation

Tym razem logrotateglob udaje się i znajduje szósty skompresowany plik dziennika, zamierzając go usunąć. Plik nie jest tak naprawdę usunięty; Chyba dlatego, że działamy w trybie debugowania.

Jestem ciekawy, czy włączenie tej delaycompressopcji /var/log/messagespomoże. Włączyłem go i sprawdzę wyniki następnego dnia rano.

Mike Mazur
źródło
Czy możesz opublikować swój plik logrotate.conf? Nic we fragmentach, które udostępniłeś do tej pory, nie wyjaśniłoby przyrostka daty w plikach wiadomości. Logrotate nie obsługiwał przyrostków daty w obróconych plikach dziennika. To prowadzi mnie do przekonania, że ​​coś zupełnie innego tworzy te pliki. Sprawdź / etc / crontab, root's crontab i /etc/cron.daily, aby sprawdzić, czy masz inny skrypt próbujący wykonać tę samą pracę.
jmtd
poza tym, czy możesz nam powiedzieć, jaką dystrybucję Linuksa używasz? Debian / Ubuntu ma swój własny skrypt rotacji logów, który może zepsuć twoje logrotate.
thepocketwade
Dziękuję za odpowiedź. Używam Gentoo Linux. Moje crontabs nie zarządzają / var / log / messages. Szczegóły znajdują się w nowych informacjach w moim pytaniu.
Mike Mazur

Odpowiedzi:

8

Dodanie delaycompressdo sekcji konfiguracji w celu /var/log/messagesrozwiązania problemu.

Od man logrotate:

   delaycompress
          Postpone  compression of the previous log file to the next rota‐
          tion cycle.  This only has effect when used in combination  with
          compress.   It  can  be used when some program cannot be told to
          close its logfile and thus might continue writing to the  previ‐
          ous log file for some time.

Chyba sysklogdmój demon syslog nie może nakazać zamknięcia swojego pliku dziennika, dlatego jest to konieczne.

Co ciekawe, oryginalna konfiguracja, którą miałem (bez delaycompressdyrektywy), pochodzi prosto z man logrotate(z wyjątkiem tego, że zmieniłem weeklyna daily):

   # sample logrotate configuration file
   compress

   /var/log/messages {
       rotate 5
       weekly
       postrotate
           /usr/bin/killall -HUP syslogd
       endscript
   }
Mike Mazur
źródło
Mówi nieznana nieznana opcja 'delalycompress' # logrotate -v /etc/logrotate.d/apc_rtbinfo.conf czytanie pliku konfiguracyjnego /etc/logrotate.d/apc_rtbinfo.conf czytanie informacji o konfiguracji dla /mnt/log/frengo/apc_rtbinfo.log error: /etc/logrotate.d/apc_rtbinfo.conf:7 nieznana opcja 'delalycompress' - ignorowanie linii Obsługa 1 logów
Ashish Karpe
# cat /etc/logrotate.d/apc_rtbinfo.conf /mnt/log/frengo/apc_rtbinfo.log {codziennie brakuje ok. pusty rozmiar 2000M kompresuj delalycompress współdzielone skrypty copytruncate obróć 3}
Ashish Karpe
1
ok, dostałem błąd, że w „delalycompress” wystąpiła literówka
Ashish Karpe
Ale teraz problem polega na tym, że log.1 to ponad 2000 mln # du -sh /mnt/log/frengo/apc_rtbinfo.log* 0 /mnt/log/frengo/apc_rtbinfo.log 4.7G /mnt/log/frengo/apc_rtbinfo.log .1 80M /mnt/log/frengo/apc_rtbinfo.log.2 0 /mnt/log/frengo/apc_rtbinfo.log-20151222 679M /mnt/log/frengo/apc_rtbinfo.log-20151225.gz 681M / mnt / log / frengo /apc_rtbinfo.log-20151226.gz 691M /mnt/log/frengo/apc_rtbinfo.log-20151227.gz 0 /mnt/log/frengo/apc_rtbinfo.log-20151228 70M /mnt/log/frengo/apc_rtbinfo.log.2. gz 80M /mnt/log/frengo/apc_rtbinfo.log.3 80M /mnt/log/frengo/apc_rtbinfo.log.4
Ashish Karpe
5

Trudno powiedzieć na podstawie tych informacji, ale mogę powiedzieć, co mnie uratowało kilka razy.

Logrotate ma opcję debugowania, która drukuje play-by-play każdego kroku, który należy wykonać do standardowego wyjścia. W takim przypadku możesz wykonać:

logrotate -d /etc/logrotate.conf

Wyjście powie ci, co dokładnie się dzieje. Ponadto, jeśli chcesz zawęzić wyniki debugowania, możesz to zrobić

logrotate -d /etc/logrotate.d/messages

Chociaż możesz tymczasowo umieścić główne opcje logrotate.conf w tym bloku plików, ponieważ bezpośrednie określenie pliku oznacza, że ​​nigdy nie będzie czytał głównych opcji konfiguracji. Określenie pojedynczego pliku oznacza również, że możesz użyć opcji -f(wymuszonej) w połączeniu z opcją debugowania, aby zobaczyć faktyczny obrót pliku wiadomości.

CarpeNoctem
źródło
Próbowałem uruchomić program logrotate ręcznie, jak sugerowałeś, i mówi mi, że kompresuje dzienniki, ale nigdzie nie znajduję żadnych skompresowanych dzienników. Zobacz moje pytanie powyżej, aby uzyskać szczegółowe informacje.
Mike Mazur
1
zmień nazwę 5 najstarszych plików wiadomości, aby kończyły się one na .gz i sprawdź, czy logrotate usuwa najstarszy tak, jak powinien. Jeśli tak, to wiemy, że globowanie kończy się niepowodzeniem z powodu nieprawidłowego działania gzip. To przynajmniej potwierdzi, że brak kompresji jest winny za brak rotacji.
CarpeNoctem
Gotowe, dodano szczegóły do ​​powyższego pytania. Jestem ciekawy, czy jest jakiś problem z rywalizacją z /var/log/messagesplikiem na żywo i ta delaycompressopcja pomoże.
Mike Mazur
Kolejny interesujący punkt, który odkryłem. Po włączeniu opcji -d polecenie logrotate nie dotyka plików dziennika. Sprawdź instrukcję, aby uzyskać więcej informacji. -d, --debug Turns on debug mode and implies -v. In debug mode, no changes will be made to the logs or to the logrotate state file.
CBR
1

Rozważ wypróbowanie tego ustawienia w pliku logrotate.conf:

dateformat .%Y%m%d

i zmień nazwę swoich istniejących plików wiadomości, aby użyć kropki zamiast myślnika. Następnie spróbuj ponownie logrotować.

Poniższe wskazówki doprowadziły mnie do przekonania, że ​​kreska może powodować awarię globu, jeśli zostanie to w jakiś sposób zinterpretowane jako opcja (gdzie - to naprawi). To nie ma sensu, ale może być możliwe.

dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
Wstrzymano do odwołania.
źródło
Nie sądzę, że to jest podstawowa przyczyna. Bieżący format daty z myślnikiem działa dobrze w przypadku innych plików dziennika. Różnica między tymi plikami dziennika /var/log/messagespolega na tym, że obrócone /var/log/messagespliki nie są kompresowane.
Mike Mazur