すべてのログファイルを切り捨てる方法は?


17

/var/log/ディレクトリ内のすべてのログファイルを切り捨てる解決策を教えてもらえますか?

そして、知識だけのための質問、それは良いアイデアですか?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done

1
良いアイデアで/var/logはありません- 後で必要になるかもしれないメッセージをシステムが置く場所です。Ubuntuは以前に問題に遭遇しました。読んでくださいman 8 logrotate;man logrotate.conf
ワルチネーター

回答:


34

これを試して:

truncate -s 0 /var/log/*log

編集:

これを複数回行いたい場合はlogrotate、ログの処理に使用する必要があります。通常、ubuntuにインストールされます。をご覧man logrotateください(または、インストールされていない場合は、オンラインマンページをご覧になるか、でインストールしてくださいsudo apt-get install logrotate

マンページから:

logrotateは、大量のログファイルを生成するシステムの管理を容易にするように設計されています。ログファイルの自動ローテーション、圧縮、削除、およびメール送信が可能です。各ログファイルは、毎日、毎週、毎月、または大きくなりすぎたときに処理されます。


また、あなたは> *ログ「」エコー使って、それらを空にすることができます
ASTM

10

第1レベルのログフォルダーにあるものだけでなく、すべてのログファイルを消去する場合は、次のように使用できます。

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

既にlogrotate実行している場合は、ローテーションされた.gzログも消去する必要があることに注意してください。

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

これの有効な使用法は、たとえば、配布用のVMアプライアンスコンテナの構築です。

定期的なメンテナンスの一環としてこれを行う必要はないはずです。DEMが非常に正しく提案しているようにlogrotate、そのために使用してください。


1

@DEN回答のフォローアップとして

これにより、すべてのログファイルが検索され/var/log、0バイトに切り捨てられます。

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0

1
*.log*代わりに使用しますが、100%安全かどうかわからないので、答えに含めていません。dovecot.log-20180930やなどのファイルがあるためですdovecot.log-20180923.gz
ルカ

0

一般的にほとんどのPOSIX準拠OSに適用される、ファイルを完全に切り捨てる方法がいくつかあります。シェルスクリプトで最もよく見られるのは、true > file.txtまたはのようなものです: > file.txtbashシェルの場合、>リダイレクトだけで十分です)。これは、フラグ付きまたはsyscall >経由でファイルを開く方法が原因です。書き込み専用で読み取るか、ファイル名が存在しない場合は作成するか、既存のファイル名を切り捨てます。open()openat()O_WRONLY|O_CREAT|O_TRUNC

それを念頭に置いて、C自身でそのようなものを実装できます。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

このコードを保存するファイルにとして名前を付けてtrunc.cでコンパイルするとgcc trunc.c -o trunc、のように提供されるファイル名引数を切り捨てる小さなユーティリティがありますtrunc ./foobar.txt。もちろん、このコードは他のチェックを行わず、最初の位置パラメーターのみを切り捨てます。複数の定位置パラメーターを処理する方法については、読者にお任せします。サイドノートではtruncate()、同様に使用でき、ファイルを可変長に切り捨てるsyscall があります。

さて、あなたがCのファンでないなら、Pythonがあなたにとってより簡単かもしれません。open()コマンドはPythonで同じ原理で動作します-ファイル名が存在する場合、書き込みおよび切り捨てのためにファイルを開きます。したがって、私たちはできる

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

すべての.logファイルの検索に関しては、すでに他の回答で説明されています-で*globまたは拡張globを使用しbashます。またfind -type f -name "*.log"-execコマンドを実行するためのフラグがあります(この特定のケースでは、外部の実行可能ファイルではなく、シェル演算子sh -c ''である>ために利用し>ます)。したがって、あなたはできる

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

また、ディレクトリ内のログファイルは/var/loglogrotateサービスによって頻繁にローテーションされるため、、などのファイル名があるため/var/log/service.log、代わりにパターン/var/log/service.log.1を使用することもできます。*.log.[1-9]


とりわけ/dev/null、目的のファイルにコピーできます。奇妙なことに、/dev/null特殊文字のデバイスタイプのファイルであっても、それを他の場所にコピーすると、少なくともGNUでは、結果は空の通常ファイルになりますcp。したがって、私たちはできる

cp /dev/null foo.txt

または

dd if=/dev/null of=foo.txt

その他の推奨読書:


0

/ var / logs内のログをローテーションしてlogrotate機能でローテーションすることをお勧めしますが、いつでもしたいわけではありません。システムログが彼女に出力され、障害をデバッグするのに役立ちます。

logrotateを使用しないことが必要な場合は、オプションを検討できます。UNIXシステムのいくつかのフレーバーでは、truncateは簡単なオプションですが、このコマンドはすぐに使用できないため、インストールする必要があります。新しいコマンドをインストールできない場合は、以下のループを使用できます。

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done

Bash Pitfall#1forループをそのように書かないでください。for logfile in /path/*.log代わりに使用してください。
PerlDuck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.