ログを消去する適切な方法はありますか?


65

一般的にログをクリアする適切な方法があるかどうか疑問に思っていましたか?

私はUbuntuが初めてで、Postfixをセットアップしようとしています。問題のログは/var/log/mail.logです。そこに行ってすべての行を削除して保存するのではなく、それをクリアする正しい方法があるかどうか疑問に思っていました。ログをクリアして保存した後、すぐにエラーが書き込まれないことがあります。

追記:Postfixの設定に問題があり、ログを最後までスクロールしなくても済むように、ログが読みやすくなるように努めています。


2
ファイルの終わりを見たいだけなら、tailがあなたの友達です。tail /var/log/mail.logを使用して、最後の5行を表示します。tail -f /var/log/mail.logを使用して、ファイルの最後に書き込まれたすべての行を表示します。
user9517

回答:


79

次を使用できます。

> /var/log/mail.log

これにより、ファイルを編集しなくてもログが切り捨てられます。また、スペースを取り戻すための信頼できる方法でもあります。他のプロセスがファイルを開いている場合、ログでrmを使用してファイル名を再作成するというミスをすることがあります。そのプロセスがそのハンドルを閉じ、アクセス権を台無しにするまで、スペースを取り戻すことはできません。

また、ログの内容を見ている場合は、tail次のコマンドを使用できます。

tail -f /var/log/mail.log

Ctrl-Cを押すと、末尾が消えます。


2
/bin/csh(FreeBSDに共通)は、「無効なnullコマンド」でこれを解決し、一方zsh(の代わりに人気のあるbash)EOFを待機します。参照してくださいserverfault.com/a/381380/67675
poige

どのようにスケジュールできますか?入れて>、それは構文として、それを認識することはできませんとしてのcrontabの構文は実行されていない
ishandutta2007

26

はい、適切な方法があります。ログをまったく消去しません。あなたは回転し、それらを。ローテーションでは、ログ出力を同じ名前の新しいファイルに切り替え、以前のN個のログファイルをN個の関連ファイル名のセットの下に保持します。

ログをローテーションする方法は、そもそもログを書き込む方法によって異なります。 これは見過ごされがちな点です。ここでの回答のいくつかは少なくともそれに触れており、一部のロギングプログラムはログファイルのオープンファイル記述子を保持しているため、ファイルを削除するだけではスペースが解放されず、実際には出力を新しいログファイルに切り替えることさえありません。

たとえば、ログファイルを書き込むプログラムmultilogdaemontoolspackageからのものである場合、ログをローテーションするために何もしませんcron。手動のスクリプトもジョブもありません。multilogログ出力はディレクトリへの出力であり、それ自体がそのディレクトリ内のN個のログファイルの自動回転およびサイズ制限セットを維持することを伝えるだけです。

別の例として、ログファイルを書き込むプログラムsvlogdrunitパッケージからのものである場合、ほぼ同じことが当てはまります。ディレクトリでツールをポイントする以外は、何もしません。それ自体は、そのディレクトリ内のN個のログファイルの自動回転およびサイズ制限セットを維持します。

rsyslogログファイルの書き込みに使用している場合、ログファイルが特定のサイズに達してスクリプトを実行した後に、ログ記録プログラムを停止するように指示できます。実際にログファイルの名前を変更し、合計サイズの制約に基づいて古いログファイルを削除するには、スクリプトの内容を記述する必要がありますが、少なくともログプログラムはファイルを閉じ、これが行われている間はログの書き込みを一時停止しました。

syslog-ngなどのロギングプログラムや、別の回答で言及されているようなツールで例示されているようにsyslogd、ログをローテーションする古い方法は、やや偶然です。定期的にログファイルの名前を変更するジョブを実行し、ロギングデーモンを再起動します(実行中のデーモンスーパーバイザーを使用)。もちろん、これに関する問題は、全体的なサイズの上限を強制しないことです。遅い週には、N個の非常に小さい日次ログファイルを取得できますが、忙しい日に、サイズ制限を十分に超える1つの非常に大きなログファイルを取得できます。 logrotatedjangofancron

これが、ファイルサイズ設定オプションのようなより優れたツールがmultilogありsvlogd、実際にログファイルサイズ自体を実際にチェックする理由です。世界は、cronジョブまたはlogrotateデーモンでスケジュールに基づいてログをポーリングすると、サイズが間違っているためにウィンドウが残され、これらのチェックを行う適切な場所があり、管理者が定義したサイズの上限を厳密に適用することを学びましたログファイルは、それらが存在するパーティションを飲み込むことはなく、実際にファイルを最初に書き出しているプログラム内にあります。


rsyslogに関しては、YEAR、MONTH、DAYなどの「パターン」で記述されたファイル名に依存するように簡単に構成できます。これは、template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")ディレクティブとそれに続くif ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat。このように、少なくとも1日1つのファイルで問題ない場合、ログローテーションは単純に問題ではありません。非常に大量のログ(1日に複数のローテーションが必要)についても$HOUR同様です。
ダミアーノヴェルズーリ

13

これも使用できます。

truncate /opt/package/logs/*.log --size 0

ここでは、/ opt / package / logs内のすべてのログファイルが空になります。


これが以前の回答よりも優れているとは思えません。
カスペルド

4
これは実際には非常に良い答えであり、ログファイルを切り捨てる適切な方法があるかどうかの質問に直接答えるのは本当に唯一の答えです。他の答えよりも優れているのは、ログファイルを削除せず、内容を適切にゼロにすることです。したがって、この場合、一部のデーモンをパニックさせる許可エラーとログファイルの欠落は発生しません。
hmedia1

11

はい、LogRotateと呼ばれるLinux用のツールがあります。


9
ちょっとした修正:これはサービスではなく、これは通常cronサービスから実行されるツールです。
rvs

10

ログをクリアする理由がスペースを解放することである場合、書き込みを行うプログラムを中断することなく、それらに/ dev / nullをcatすることができます。それらを削除しないでください!一部のソフトウェアは、次の再起動まで動作を停止したり、ログを完全に無視したりして文句を言う場合があります

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

3
ログファイルを再帰的にクリアするには:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai

4

短く互換性のあるコンテンツの上書き: : > /dest/file

しかし、truncate(2)システムコール、およびtruncate多くの* NIXに対応するユーザースペースツールもあります。


1

クリーンアップする前にファイルを保持する場合は、次の操作を実行できます。

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

ログ内の特定のテキストまたはメールを検索する場合は、grepを使用できます。メールの使用状況に関するグラフィックを保持する場合は、AWStatsを使用できます。


1

私がそれを行う方法は次のとおりです。これはNGINX専用です。すべて削除して、すべてのログファイルで動作するようにすることができます。

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}

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