アプリケーションログをローテーションするために、「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>
私も同様の問題を抱えていました。これを解決するために、最初にsestatusコマンドを使用してSELinuxのステータスを確認しました。
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
次に、ls --scontextを使用して、ファイルとディレクトリに適用されているSELinuxセキュリティコンテキストを確認します。 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は、/ usr/sbin/logrotateがディレクトリサイトへの読み取りアクセスを阻止しています。
*****プラグインキャッチオール(100.信頼度)は***************************を示唆しています
Logrotateにデフォルトでsitesディレクトリへの読み取りアクセスを許可する必要があると思われる場合。次に、これをバグとして報告する必要があります。このアクセスを許可するローカルポリシーモジュールを生成できます。
行う
次のコマンドを実行して、今のところこのアクセスを許可します。# grep logrotate /var/log/audit/audit.log | audit2allow -M mypol # semodule -i mypol.pp
最近、ローテーションされるログがNFS共有上にあるときに発生した、logrotate
が期待どおりにファイルで動作しないという同様のSELinux関連の問題が発生しました。
この場合、logrotate_use_nfs
sebooleanを設定すると、問題が解決したようです。
$ setsebool logrotate_use_nfs 1
$ getsebool logrotate_use_nfs
logrotate_use_nfs --> on
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.
親ディレクトリを755にchmodすると、問題が解決しました
# logrotate --version
logrotate 3.8.6