web-dev-qa-db-ja.com

Logrotateが機能しない

VPSでlogrotateを動作させ、Apacheファイルを毎週ローテーションさせようとしています。現在、Apache2設定ファイルの内容はそのとおりです。

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/Apache2 reload > /dev/null
        endscript
}

私はそれを2週間残しましたが、私が知る限り、何も変わっていません。コマンドラインからシミュレーションすると、次の出力が得られます。

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/Apache2
reading config file /etc/logrotate.d/Apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

私が間違って設定したものについてのアイデアはありますか?

私のステータスファイルも空です:(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

更新

ステータスファイルを削除してlogrotateを強制実行したところ、ログはローテーションされたように見え、ステータスファイルはより有望に見えます。

Sudo rm /var/lib/logrotate/status

Sudo /usr/sbin/logrotate -f /etc/logrotate.conf
18
Malachi

weeklyは、それをローテーションするために、logrotateがaccess.logファイルの少なくとも1週間前のエントリを表示したいと考えていることを意味します。

したがって、問題は、ローテーションをトリガーするための状態エントリを保存していないことです。


以下は、logrotateがログファイルをローテーションすることを決定する方法の単純なケースのステップスルーの例です。
(これらはFedoraパスであり、Ubuntu、Centosなどは異なる場合があります)

http://localhostにいくつかのリクエストを行ったため、access_logにいくつかのエントリがあります。それ以外の場合、logrotateはローテーションしません...)

そこで、Apacheのlogrotateを毎週のように設定しました。

/var/log/httpd/*log {
        weekly
...
}

もともと/var/lib/logrotate.statusファイルにエントリがありません

# grep access_log /var/lib/logrotate.status
<- nothing

そのため、logrotateはaccess_logファイルをローテーションしません。

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

ただし、このように手動でlogrotateを実行すると、

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

これで、httpd access_logの状態ファイルにエントリがあります。

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

ただし、エントリは0日しか経過していないため(2012-5-11)、Apacheはまだログをローテーションしません。

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

ただし、ステータスファイルをvi vi /var/lib/logrotate.statusで編集すると、次のようになり、日付が1週間以上に設定されます...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

次に、状態ファイルの日付2012-4-11が今日から1週間以上前であるため、logrotateはファイルを正しく回転します2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

-dは模擬実行を引き起こすため、検査にのみ役立ちます。実際に-dなしでコマンドを実行してステータスエントリを作成したり、ファイルをローテーションしたりする必要があることを覚えておいてください)

18
Tom H
log does not need rotating

これは、ログファイルが空であるためです。
Apacheを再起動せずに名前が変更された以前のログファイルにApacheが引き続き書き込むため、この状況が発生する可能性があります。したがって、access.logはaccess.log.1になり、Apacheはそれに書き込みます。

または、ログの作成時間に問題があります:

ls -al --time=ctime /var/www/user/site.com/logs/
7
Gregory MOUSSAT

これらの回答がどれも役に立たなかったことを除いて、私は同様の問題に直面しました。私のログファイルは巨大で古く、設定は100%正常で有効でした。ステータスファイルを削除しても解決しませんでした。

問題は重複したlogrotateエントリにあることが判明しました。そのような設定ファイルでのみlogrotateを手動で実行すると:

logrotate -df /etc/logrotate.d/my_service_name

エラーは表示されませんでした。

log does not need rotating

なぜなのかはまだわかりません。しかし、そのような完全なlogrotateコマンドを実行すると:

logrotate -f /etc/logrotate.conf

私は次の行を得ました:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

私のサービスのlogrotate構成ファイルには、ローテーションnginxアクセスログのエントリとサービスログ自体が含まれていることがわかりました。そして、それはすべてのnginxエントリに対するルールを持つngnix logrotate設定と衝突しました:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

だから私のケースの解決策はかなり簡単です:私は競合の削除 nginxログ私の設定からの回転ルールをしなければなりませんでした。

Logrotateは、最新バージョンの1つからのみルールの競合でファイルの処理を中止し始めたと思います。 v.3.8.7でこのエラーが発生しますが、v.3.7.8で同じ競合する構成を使用すると、同じエラーが出力されますが、正常に回転します。 logrotate changelogにその記録は見つかりませんでしたが。

6
Innokenty

Sudo logrotate -f --verbose /etc/logrotate.d/Apache2を実行してみてください。コンソールに何が表示されているかを確認し、問題がある場合は修正してください。

2
Aminah Nuraini

システムアップデート後にメールログをローテーションしないDebian 7マシンを使用していました。メール以外のすべてのログは正しくローテーションされました。メールのログが数ギガバイト大きくなっていることを発見しました。私は常にWebminを介してログローテーションを管理していました。次に、logrotate -d /etc/logrotate.conf次のメッセージが表示されました。

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

私のメールローテーションエントリが/etc/logrotate.d/rsyslog.dpkg-old、無視されました!ファイルの名前を変更すると、ログファイルのローテーションが修正されました:-)

0
lucaferrario