Linuxで実行されているApacheサーバーで、非常に大きくなるログファイル(access_log)に書き込んでいます。サーバーの空き容量がなくなります。サーバーを再起動せずにファイルを削除または切り捨てる方法はありますか(ダウンタイムは必要ありません)。
ログファイルをリセットする方法
遅かれ早かれ、ログファイルをリセットする必要があります(access_log
およびerror_log
)それらが大きすぎるか、不要な古い情報でいっぱいだからです。
access_log
は通常、10,000リクエストごとに1Mbずつ増加します。
ほとんどの人がログファイルを置き換える最初の試みは、単にログファイルを移動するか削除することです。これは機能しません。
Apacheは、ログファイルが移動する前と同じオフセットでログファイルへの書き込みを続行します。これにより、古いログファイルと同じ大きさの新しいログファイルが作成されますが、現在では数千(または数百万)のnull文字が含まれています。
正しい手順は、ログファイルを移動してから、Apacheにログファイルを再度開くように通知することです。
Apacheは[〜#〜] sighup [〜#〜](-1)シグナルを使用してシグナルされます。例えば.
mv access_log access_log.old kill -1 `cat httpd.pid`
注意: httpd.pid
は、Apache httpdデーモンのプロセスIDを含むファイルです。Apacheは、これをログファイルと同じディレクトリに保存します。
多くの人がこの方法を使用して、毎晩または毎週ログファイルを置換(およびバックアップ)しています。
ログローテーションは長期的な解決策ですが、当面の質問に対する答えは、次のようなファイルを切り捨てることです。
Sudo cat /dev/null > /var/log/httpd/access_log
ルートとしてログインしておらず、ログファイルの場所を想定していますが、必要に応じてコマンドを調整し、実行中のApacheプロセスに影響を与えずに開いているログファイルをすばやく切り捨てることができます。
ログファイルをゼロにする...
# :>filename
書き込みアクセス権がないログファイルを切り捨てる/ゼロにする場合は、次のようにすることができます
Sudo truncate -s0 logfile
logrotate
を使用してみてください
prerotate
とpostrotate
の間にコマンドを実行する機能もありますcopytruncate
を使用すると、既存のファイルをコピーしてから切り捨てることができます。コピーは、必要に応じて、hadoop、バックアップ用のs3などの別のストレージに移動できます。/usr/sbin/logrotate --force /etc/logrotate.hourly.conf 2>&1 >> /tmp/logger
を使用して、/etc/cron.hourly/logrotate
などのcronを設定できます。詳細man logrotate
$ cat filename >bkp_filename
のように元のファイルを無効にするよりも「filename」のコピーを作成するよりも、最初に$ >filename
を作成できます。これでサイズがゼロに縮小されます。これで、$ gzip bkp_filename
のようなbkp_filenameにZipが作成されるため、サイズが大きくなり、マウントポイントは緑色になります。
プロセスに同じ問題があり、Linux名前付きパイプを使用して修正しました。ここに私がやったことがあります(/tmp/job.logがログファイルであると仮定):
このようにして、ログを保持し、ディスク使用量を大幅に削減することができました
gzipは、フィルター処理、回転などのコマンドに置き換えることができます。