一般的にログをクリアする適切な方法があるかどうか疑問に思っていましたか?
私はUbuntuを初めて使い、Postfixをセットアップしようとしています。問題のログインは/var/log/mail.log
。そこに行ってすべての行を削除して保存するのではなく、それをクリアする正しい方法があるのかと思っていました。ログをクリアして保存した直後に、エラーが書き込まれないことがあります。
補足:Postfixの設定に問題があり、下にスクロールしなくてもログが読みやすくなるようにして、ログが読みやすくなるようにしています。
以下を使用できます。
> /var/log/mail.log
これにより、ファイルを編集せずにログが切り捨てられます。スペースを取り戻すための信頼できる方法でもあります。時々人々はログでrmを使用してファイル名を再作成するという間違いを犯します、別のプロセスがファイルを開いている場合、そのプロセスがハンドルを閉じるまでスペースを取り戻せず、その権限を台無しにすることができます。
また、ログの内容を監視している場合は、tail
コマンドを使用できます。
tail -f /var/log/mail.log
Ctrl-Cは、テーリングを切り離します。
はい、適切な方法があります:ログをまったくclearしないでください。あなたはそれらを回転させます。ローテーションでは、ログ出力を同じ名前の新しいファイルに切り替え、以前のN個のログファイルをN個の関連するファイル名のセットで保持します。
ログをローテーションする方法は、最初にログを書き込む方法によって異なります。これは、見落とされがちな点です。ここでの回答のいくつかは少なくともそれに触れており、一部のロギングプログラムはログファイルのオープンファイル記述子を保持しているため、ファイルを削除するだけではスペースが解放されず、出力が新しいログファイルに切り替えられることもありません。
たとえば、ログファイルを書き込むプログラムが multilog
パッケージのdaemontools
の場合、ログをローテーションするための操作はまったくありません—マニュアルはありませんスクリプト、cron
ジョブはありません。ログ出力はディレクトリに対するものであることをmultilog
に伝えるだけで、それ自体が自動的にローテーションされ、サイズが制限されたN個のログファイルのセットをそのディレクトリに保持します。
別の例として、ログファイルを書き込むプログラムが svlogd
パッケージのrunit
の場合、ほとんど同じことが当てはまります。ツールをディレクトリに置く以外は何もしません。それ自体が、そのディレクトリ内で、自動的にローテーションされサイズが制限されたN個のログファイルのセットを維持します。
rsyslog
を使用してログファイルを書き込む場合、 ログファイルが特定のサイズに達したらスクリプトを停止してスクリプトを実行するように指示することができます 。実際にログファイルの名前を変更し、合計サイズの制限に基づいて古いログファイルを削除するには、スクリプトの詳細を記述する必要がありますが、少なくともログプログラムはファイルを閉じ、ログの書き込みを一時停止しています。
ログをローテーションする古いsyslogd
の方法 syslog-ngなどのロギングプログラムではまだ期待されています と、logrotate
などのツールで例示されているdjangofan
ここの別の答えでは、やや無計画です。 1つは、定期的にログファイルの名前を変更するcron
ジョブを実行し、(それが実行されているデーモンスーパーバイザを使用して)ロギングデーモンを再起動します。もちろん、これの問題は、全体的なサイズの上限を強制しないことです。遅い週には、N個の非常に小さなログファイルを取得できますが、忙しい日には、サイズ制限をはるかに超える非常に大きな1つのログファイルを取得できます。
これが、後で、multilog
やsvlogd
などの優れたツールにファイルサイズの構成オプションがあり、実際にログファイルのサイズ自体を確認するのはこのためです。世界は、cron
ジョブ、またはlogrotate
デーモンを使用してスケジュールでログをポーリングすると、ウィンドウがサイズを間違えていること、およびこれらのチェックを行う適切な場所があることを知っています。そして、厳密にログファイルが自分がいるパーティションを飲み込まないように、管理者が定義したサイズの上限を強制します最初にファイルを実際に書き出す。
これも使えます。
truncate /opt/package/logs/*.log --size 0
ここで、/ opt/package/logs内のすべてのログファイルが空になります。
はい、Linux用のツール LogRotate があります。
ログをクリアする理由がスペースの解放である場合は、プログラムへの書き込みを中断せずに、/ 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
短い互換性のあるコンテンツの上書き:: > /dest/file
しかし、多くの* NIXには、truncate(2)システムコールと、対応するユーザースペースツールtruncate
もあります。
ここに私がそれをする方法があります、そしてこれはちょうど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 ... ---------------"
}
クリーンアップする前にファイルを保持したい場合は、以下を実行できます。
cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log
ログ内の特定のテキストまたは電子メールを検索する場合は、grepを使用できます。メールの使用に関するグラフィックを保持したい場合は、AWStatsを使用できます。