web-dev-qa-db-ja.com

ログをクリアする適切な方法はありますか?

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

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

補足:Postfixの設定に問題があり、下にスクロールしなくてもログが読みやすくなるようにして、ログが読みやすくなるようにしています。

69
mastofact

以下を使用できます。

> /var/log/mail.log

これにより、ファイルを編集せずにログが切り捨てられます。スペースを取り戻すための信頼できる方法でもあります。時々人々はログで​​rmを使用してファイル名を再作成するという間違いを犯します、別のプロセスがファイルを開いている場合、そのプロセスがハンドルを閉じるまでスペースを取り戻せず、その権限を台無しにすることができます。

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

tail -f /var/log/mail.log

Ctrl-Cは、テーリングを切り離します。

84
davey

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

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

たとえば、ログファイルを書き込むプログラムが multilogパッケージのdaemontools の場合、ログをローテーションするための操作はまったくありません—マニュアルはありませんスクリプト、cronジョブはありません。ログ出力はディレクトリに対するものであることをmultilogに伝えるだけで、それ自体が自動的にローテーションされ、サイズが制限されたN個のログファイルのセットをそのディレクトリに保持します。

別の例として、ログファイルを書き込むプログラムが svlogdパッケージのrunit の場合、ほとんど同じことが当てはまります。ツールをディレクトリに置く以外は何もしません。それ自体が、そのディレクトリ内で、自動的にローテーションされサイズが制限されたN個のログファイルのセットを維持します。

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

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

これが、後で、multilogsvlogdなどの優れたツールにファイルサイズの構成オプションがあり、実際にログファイルのサイズ自体を確認するのはこのためです。世界は、cronジョブ、またはlogrotateデーモンを使用してスケジュールでログをポーリングすると、ウィンドウがサイズを間違えていること、およびこれらのチェックを行う適切な場所があることを知っています。そして、厳密にログファイルが自分がいるパーティションを飲み込まないように、管理者が定義したサイズの上限を強制します最初にファイルを実際に書き出す。

26
JdeBP

これも使えます。

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

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

18
Yasar

はい、Linux用のツール LogRotate があります。

11
djangofan

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

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
10
Elvis

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

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

4
poige

ここに私がそれをする方法があります、そしてこれはちょうど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 ... ---------------"
}
1
Ahmad Awais

クリーンアップする前にファイルを保持したい場合は、以下を実行できます。

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

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

1
ghm1014