14

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

最初の echo ステートメントは機能しています。
しかし、httpd などの他のログがローテーションされているのに対し、アプリケーション ログだけではローテーションされていないことがわかりました **
**また、前述の「logrotate_error」ファイルに出力が表示されません
(すべてのユーザーに書き込み権限があります)。

ただし、syslog には次のように記載されています。 「logrotate: ALERT が [1] で異常終了しました」

しかし、「cron.daily」スクリプトで同じ「logrotate」を手動で実行すると、すべて正常に動作しているように見えます。

毎日のcronスケジュール中にローテーションしないのはなぜですか? ここで何か間違ったことをしていますか?
こんなに必要な助けが得られたら素晴らしいことです。

更新: selinux が原因のようです。ユーザーのホーム ディレクトリのログ ファイルには、selinux によって課された制限と、logrotate スクリプトが実行されたときの制限があります。

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

6 に答える 6

16

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

semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>
于 2013-05-24T18:19:39.397 に答える
7

同様の問題がありました。これを解決するために、まず 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>
于 2014-08-05T16:43:58.620 に答える
2

上記を一般化して、今後のすべてのファイルに対して同じ SELinux コンテキストが適切に設定されていることを確認します。

semanage fcontext -a -t var_log_t "<directory>(/.*)?"
restorecon -v <directory>
于 2015-04-29T09:20:48.953 に答える