アプリケーションログをローテーションするために、「logrotate.d」ディレクトリに2つのスクリプトを追加しました。これは、そのうちの1つの構成です。
<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」ファイルに出力が表示されません(すべてのユーザーの書き込み権限があります)。
ただし、syslogは次のように述べています。"logrotate:ALERTが[1]で異常終了しました"
しかし、「cron.daily」スクリプトで同じ「logrotate」を手動で実行すると、すべてが正常に機能しているように見えます。
毎日のcronスケジュール中にローテーションしないのはなぜですか?私はここで何か間違ったことをしていますか?
これだけ必要な助けが得られたら素晴らしいと思います。
PDATED: selinuxが原因のようです-ユーザーのホームディレクトリのログファイルには、selinuxとlogrotateスクリプトの実行時に課せられる制限があります。
SELinux is preventing /usr/sbin/logrotate from getattr access on the file /home/user/logs/application.log
SELinuxは、必要なSELinuxファイルコンテキストタイプを持たないディレクトリ内のログファイルでlogrotateへのアクセスを制限していました。 "/ var/log"ディレクトリには"var_log_t"ファイルコンテキストがあり、logrotateは必要な処理を実行できました。したがって、解決策は、アプリケーションのログファイルとその親ディレクトリにこれを設定することでした。
semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>