web-dev-qa-db-ja.com

logrotatecronジョブが特定のログをローテーションしない

アプリケーションログをローテーションするために、「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
4
user2206396

SELinuxは、必要なSELinuxファイルコンテキストタイプを持たないディレクトリ内のログファイルでlogrotateへのアクセスを制限していました。 "/ var/log"ディレクトリには"var_log_t"ファイルコンテキストがあり、logrotateは必要な処理を実行できました。したがって、解決策は、アプリケーションのログファイルとその親ディレクトリにこれを設定することでした。

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