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