
ログがcatalina.out
。
他のサーバーはあまりにも多くのスペースを占めているため、非自発的に停止する必要がありました。catalina.out
少なくともサーバーを削除して再起動するだけでチケットを心配する必要がないように、粘着テープでこの問題を修正したいと思います。
よくわかりませんが、1日のログが5GBを超えました。それでは、私がやりたいことをやろう予約されたこと1日後のファイルまたはファイルの最後の5GBを削除します。ここではどのコマンドが機能しますか?
これが問題に推奨される解決策ですか?それとももっと良い方法がありますか?
答え1
catalina.out
ほとんどでなければなりません空これは、アプリケーションがすべてのエラーを傍受し、それ自体を処理し、構成内の他の場所に記録できることを意味します。しかし、通常、これは完了せずにcatalina.out
考慮されます。これアプリケーションログ。 Tomcatはデフォルトでファイルを回転しないため、問題が発生します。
アプリケーションを修復することに加えてファイルを切り捨てるより良い方法catalina.out
は、特定のパッケージインストールですでに提供されているか(CentOS7用のtomcat 7では適切なcatalina.out
ログローテーションが提供されている)、新しいtomcatバージョンを使用することです。 〜のようにエラー64430WHO固定する最新のTomcatに統合され、Tomcat> = 7.0.105、> = 8.5.56、および> = 9.0.36にバックポートされました。
はい(1行にすべて)
CATALINA_OUT_CMD="/usr/bin/rotatelogs -f $CATALINA_BASE/logs/catalina.out.%Y-%m-%d.log 86400"
回転したファイルをさらに処理する必要があります。logrotate
またはそれに対応する特別なツール。
この質問に厳密に答えるか、少なくとも1つのファイル処理に関する部分に答えてくださいcatalina.out
。 OPは次のように書きました。
Linuxでファイルの最後のnバイトを除いてすべてを削除する方法は?
=>終わりを維持
ファイルの最後の5GBを削除してください。
=>続行
始め続ける
これで端を取り除きます。削除しても終わり代わりにログスタートロギングは悪い考えです。
POSIXtruncate(2)
:
名前
truncate - ファイルを指定された長さに切り捨てます。
[...]
説明する
truncate() 関数は、パスと呼ばれる一般ファイルのサイズを length バイトと同じにします。
コマンド実装がありますtruncate(1)
。 ~のためGNU切り捨て(GNUと共にstat(1)
)はこのようにシェルで使用されます(最初にファイルが5GiBより大きいことを確認する必要があります。そうしないとサイズが大きくなります)。 5GiB予約:
if [ $(stat -c %s catalina.out) -gt $((5*1024*1024*1024)) ]; then
truncate -s $((5*1024*1024*1024)) catalina.out
fi
結末を守る
これによりファイルの先頭が削除されます。これは、データをコピーせずにLinuxや十分なファイルシステム(Ext4、XFSなど)で次のように実行できます。fallocate(1)
(追加のLinux専用機能を含む):
-p
、--punch-hole
オフセットから始まり、長さのバイトまでバイト範囲のスペースを確保します(つまり、穴を作成します)。
これにはデータのコピーは含まれませんが、ブロックソート(通常は4096バイトソート)が必要です。コピーコストなしでリングバッファのように常にファイルの終わりを維持できます。次のように使用できます(4096の倍数をソートするには追加の計算が必要です)。
oldsize=$(stat -c %s catalina.out) || exit 1
if [ $oldsize -gt $((5*1024*1024*1024)) ]; then
holesize=$(( (oldsize-5*1024*1024*1024)/4096*4096 ))
fallocate --punch-hole --length "$holesize" catalina.out
fi
--punch-hole
--collapse-range
Tomcatの進行中の出力が中断されないようにするには(サイズを小さくするために残りのデータを最初に「移動」)、代わりに(ファイルを薄くし、見かけのサイズを維持してディスク容量を確保する)を使用してくださいcatalina.out
。それ以外の場合は、Tomcatを再起動の前後に停止する必要があります。
答え2
tail catalina.out > catalina.new
rm catalina.out
mv catalina.new catalina.out
次に、tomcatを再起動または再ロードして新しいファイルにログを追加する必要があります(現在は、削除された古いcatalina.outファイルのファイル記述子がまだ開いています)。
tail
(からコアツール)には次のパラメータがあります。
-c
、--bytes=[+]NUM
最後のバイトを出力したり、NUM
各ファイルのバイトから出力-c +NUM
するために使用されます。NUM
-n
、最後の10行の代わりに--lines=[+]NUM
最後の数行を出力するか、その行で始まる出力の場合。NUM
-n +NUM
NUM
他のパラメータについてはお問い合わせください。man tail
。
答え3
症状を治療するのではなく、病気を治療してください。
他の人が述べたように、「適切なロギング」を使用すると、これらの問題を回避できます。ただし、適切なロギングには、開発チーム、開発 - テスト - リリースサイクルなどが含まれます。問題を解決したいかもしれません。今。
catalina.out
パディングの理由は、アプリケーションが書き込みstdout
、おそらくを使用またはSystem.out.println
類似しているためです。これは悪く、時間の経過とともに修正する必要があります。
幸いなことに、Tomcatには絆創膏があります。あなたがしなければならないのは、META-INF/context.xml
アプリケーション(または<Context>
定義がある場所であれば、おそらくまたはconf/server.xml
)conf/[engine]/[host]/[app].xml
でファイルを編集して次を追加することだけです<Context>
。
swallowOutput="true"
探すhttps://tomcat.apache.org/tomcat-9.0-doc/config/context.html「swallowOutput」については、指示を参照してください。
これにより、アプリケーションのすべての内容がインポートされ、アプリケーション固有のログファイルに保存されます。はい回転可能。
これにより、ファイルを「短縮」するゲームをプレイするのではなく、数日後にログ全体を削除できます。