Logrotate не удаляет сжатые журналы

Logrotate не удаляет сжатые журналы

У меня есть CentOS box, на котором запущены rsyslog и logrotate в качестве сервера syslog для целой кучи сетевых устройств. Я некоторое время экспериментировал с этим, logrotate/compression работает нормально, но я не могу заставить его удалить старые сжатые логи .gz. Вот базовая настройка:

Журналы хранятся в: /var/log/syslog, и каждый хост создает новую подпапку на основе своего IP-адреса или имени хоста. У меня есть два конкретных хоста, которые очень болтливы, поэтому у меня есть специальные правила для них, чтобы они обрезались после 5 ГБ. Идея состоит в том, чтобы сжимать и начинать новый журнал каждый день и хранить журналы за 60 дней.

Вот мои конфигурации (большинство из них созданы не мной, но некоторые из них я сохранил и изменил):

кошка /etc/cron.hourly/logrotate

#!/bin/sh`enter code here`
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

кошка /etc/logrotate.d/syslog

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    compress
    daily
    #delaycompress
    dateext
    missingok
    rotate 60
    maxage 60
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

кошка /etc/logrotate.conf

/var/log/syslog/*/*.log {
daily
rotate 60
maxage 60
compress
}

daily
rotate 60
create
dateext
compress
include /etc/logrotate.d

/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
# Specific rule for HOST_A
/var/log/syslog/HOST_A/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}

# Specific rule for HOST_B
/var/log/syslog/HOST_B/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}

А вот пример того, что у меня в папке \var\log\syslog\host_a:

ls /var/log/syslog/HOST_A/ | wc -l

104

ls /var/log/syslog/HOST_A/ -lh

-rw------- 1 root root  416M Jun 20 23:59 HOST_A_2018_06_20.log.1.gz
-rw------- 1 root root   64M Jun 20 16:18 HOST_A_2018_06_20.log.2.gz
-rw------- 1 root root  1.5G Jun 21 23:59 HOST_A_2018_06_21.log.1.gz
<many files redacted>
-rw------- 1 root root  1.6G Sep  4 23:59 HOST_A_2018_09_04.log.1.gz
-rw------- 1 root root  1.5G Sep  5 23:59 HOST_A_2018_09_05.log.1.gz
-rw------- 1 root root  7.7G Sep  6 10:58 HOST_A_2018_09_06.log

Итак, как вы видите выше, он не удаляет старые архивные логи .gz через 60 дней. Он хранит их неопределенно долго. Мне приходилось периодически заходить и вручную удалять старые файлы, чтобы уменьшить размер. Эти файлы идут с 6/20 по 9/6 (сегодня), что составляет 104 дня. Я уверен, что я неправильно настроил его, но не уверен, что именно я упускаю. Любая помощь будет оценена по достоинству.

решение1

Вы используете два механизма для ежедневных лог-файлов, и они не взаимодействуют друг с другом.

С одной стороны, вы позволяете syslog генерировать ежедневные файлы, с другой стороны, вы позволяете logrotate ротировать файлы. Logrotate будет обрабатывать каждый ежедневный файл как отдельный уникальный набор файлов (он не считает HOST_A_2018_09_05.log связанным с HOST_A_2018_09_06.log) для ротации, поэтому он никогда не доберется до пяти файлов на шаблон.

Лучше либо не включать дату в имя файла, либо позволить syslog самостоятельно удалять старые файлы.

Связанный контент