logrotate cron не вращает определенные журналы

Я добавил два скрипта в каталог "logrotate.d" для ротации журналов приложений. Это конфиг для одного из них:

<myLogFilePath> {
  compress
  copytruncate
  delaycompress
  dateext
  missingok
  notifempty
  daily
  rotate 30
}

В каталоге "cron.daily" есть скрипт "logrotate" (который, кажется, выполняется ежедневно согласно журналам cron):

#!/bin/sh

echo "logrotate_test" >>/tmp/logrotate_test
#/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
/usr/sbin/logrotate -v /etc/logrotate.conf &>>/root/logrotate_error

EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

Первое эхо заявление работает.
Но я нахожу, что одни только журналы моего приложения не вращаются, тогда как другие журналы, такие как httpd, вращаются **
** И я также не вижу никакого вывода в упомянутом файле "logrotate_error" (имеет разрешение на запись для всех пользователей).

Однако системный журнал говорит: "logrotate: ALERT аварийно завершился с [1]"

Но когда я запускаю тот же "logrotate" в сценарии "cron.daily" вручную, кажется, что все работает нормально.

Почему он не вращается во время ежедневного расписания cron? Я что-то здесь не так делаю?
Было бы здорово, если бы я получил столь необходимую помощь.

ОБНОВЛЕНО: Похоже, это из-за selinux - файлы журналов в моем домашнем каталоге пользователя имеют ограничения, наложенные selinux, и когда запускается скрипт logrotate:

SELinux is preventing /usr/sbin/logrotate from getattr access on the file /home/user/logs/application.log

6 ответов

SELinux ограничивал доступ к logrotate в файлах журналов в каталогах, которые не имеют требуемого типа контекста файла SELinux. Каталог "/var/log" имеет контекст файла "var_log_t", и logrotate смог сделать все необходимое. Таким образом, решение состояло в том, чтобы установить это в моих файлах журнала приложения и его родительском каталоге:

semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>

У меня была похожая проблема. Чтобы решить эту проблему, я сначала проверил состояние SELinux с помощью команды sestatus:

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

Затем проверьте контекст безопасности SELinux, примененный к файлам и каталогам, с помощью ls --scontext. Проверьте файлы, с которыми вы хотите работать logrotate, и проверьте работающие файлы, такие как /var/log/maillog:

# ls --scontext /var/log/maillog*
system_u:object_r:var_log_t:s0   /var/log/maillog
system_u:object_r:var_log_t:s0   /var/log/maillog-20140713
system_u:object_r:var_log_t:s0   /var/log/maillog-20140720
system_u:object_r:var_log_t:s0   /var/log/maillog-20140727
system_u:object_r:var_log_t:s0   /var/log/maillog-20140803

Используйте semanage, чтобы изменить контекст файла.

semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>

Просто обобщите вышесказанное и убедитесь, что один и тот же контекст SELinux правильно установлен для всех будущих файлов:

semanage fcontext -a -t var_log_t "<directory>(/.*)?"
restorecon -v <directory>

Я недавно столкнулся с похожей проблемой, связанной с SELinux logrotate не работает с файлами, как ожидалось, что произошло, когда журналы, которые должны быть повернуты, находились в общей папке NFS.

В этом случае настройка logrotate_use_nfs Себулан, казалось, решил проблему, например,

$ setsebool logrotate_use_nfs 1
$ getsebool logrotate_use_nfs
logrotate_use_nfs --> on

SELinux запрещает /usr/sbin/logrotate доступ для чтения на сайтах каталогов.

***** Плагин поймал (100. доверие) предлагает ***************************

Если вы считаете, что logrotate должен быть разрешен доступ для чтения в каталоге сайтов по умолчанию. Тогда вы должны сообщить об этом как об ошибке. Вы можете создать модуль локальной политики, чтобы разрешить этот доступ.
Делать
разрешите этот доступ сейчас, выполнив:

# grep logrotate /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

Я видел эту проблему с отключенным SELINUX, и это было потому, что родительский каталог вращаемого файла журнала имеет глобальное разрешение на запись, которое не приветствуется logrotate

error: skipping "/xxx/yyy/log/logfile.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

chmod родительский каталог на 755 решил проблему

# logrotate --version
logrotate 3.8.6
Другие вопросы по тегам