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
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
なしでコマンドを実行してステータスエントリを作成したり、ファイルをローテーションしたりする必要があることを覚えておいてください)
log does not need rotating
これは、ログファイルが空であるためです。
Apacheを再起動せずに名前が変更された以前のログファイルにApacheが引き続き書き込むため、この状況が発生する可能性があります。したがって、access.logはaccess.log.1になり、Apacheはそれに書き込みます。
または、ログの作成時間に問題があります:
ls -al --time=ctime /var/www/user/site.com/logs/
これらの回答がどれも役に立たなかったことを除いて、私は同様の問題に直面しました。私のログファイルは巨大で古く、設定は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にその記録は見つかりませんでしたが。
Sudo logrotate -f --verbose /etc/logrotate.d/Apache2
を実行してみてください。コンソールに何が表示されているかを確認し、問題がある場合は修正してください。
システムアップデート後にメールログをローテーションしないDebian 7マシンを使用していました。メール以外のすべてのログは正しくローテーションされました。メールのログが数ギガバイト大きくなっていることを発見しました。私は常にWebminを介してログローテーションを管理していました。次に、logrotate -d /etc/logrotate.conf
次のメッセージが表示されました。
Ignoring rsyslog.dpkg-old, because of .dpkg-old ending
私のメールローテーションエントリが/etc/logrotate.d/rsyslog.dpkg-old
、無視されました!ファイルの名前を変更すると、ログファイルのローテーションが修正されました:-)