Logrotateが機能しない


18

私は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

Iv'eの構成が間違っているというアイデアはありますか?

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

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

回答:


17

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ステータスエントリを作成したりファイルをローテーションするなどせずにコマンドを実際に実行する必要があることに注意してください)


1
ログファイルには1週間以上前のエントリがありました-現在は機能しているように見えますが、今から1週間後になると思います
...-Malachi

2
申し訳ありませんが、答えをもっと明確にすることはできましたが、週ごとにローテーションするには、ファイル/var/lib/logrotate.statusに少なくとも1週間前の日付のエントリが必要だと思います。私は例と答え...更新
トム・H

このような明確な説明をありがとう-私は物事の日付側について完全に理解しています。手動でコマンドを呼び出さない限り、回転しないだけです...それはCRONがログ回転を呼び出していないかのようですか?
マラキ

私はLinuxの管理には比較的慣れていません... /etc/cron.daily/logrotate/の中に#!/ bin / sh test -x / usr / sbin / logrotate ||があります。0番出口
マラキ

7
log does not need rotating

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

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

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

notifempty行をコメント化して、ローテーションしない0バイトのログを処理できます。次にtouch、各テストの前に新しいログファイルを作成して、logrotateに回転させるものがあるようにします。
バンジャー

6

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

問題は重複したlogrotateエントリにあったことが判明しました。configファイルで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 {

したがって、私の場合の解決策は非常に簡単です:configから競合する nginxログローテーションルール削除する必要がありました。

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


あなたは最新バージョンについて正しいようです。また、エントリが重複していました。ただし、手動でlogrotateを実行する場合; うまくいきました。夜には戻り値0。しかし、それは正しく実行されませんでした...
クリスメイズ

2

実行してみてsudo logrotate -f --verbose /etc/logrotate.d/apache2 くださいコンソールに書かれたものを見て、間違っているものを修正してください。


0

私はDebian 7マシンを持っていましたが、システムのアップデート後、メールログをもう回転させませんでした。メール以外のすべてのログは正しくローテーションされました。メールログが数ギガバイト増加したことを発見しました。私は常にWebmin経由でログローテーションを管理していました。その後、実行するlogrotate -d /etc/logrotate.confと次のメッセージが表示されました。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.