web-dev-qa-db-ja.com

アクティブなログファイルから最初のN行を削除する

アプリケーションによってアクティブに追加されているログから最初のN行を削除する方法はありますか?

28
Adam Matan

いいえ、Linuxなどのオペレーティングシステムとそのファイルシステムは、ファイルの先頭からデータを削除するためのプロビジョニングを行いません。つまり、ファイルのストレージの開始点は固定されています。

ファイルの先頭から行を削除するには、通常、残りのデータを新しいファイルに書き込み、古いファイルを削除します。プログラムが古いファイルを書き込み用に開いている場合、そのファイルの削除は、アプリケーションがファイルを閉じるまで延期されます。


コメント投稿者が述べたように、前の文で示した理由により、通常はログファイルのプルーニングをログを書き込むプログラムと調整する必要があります。これをどのように行うかは、プログラムによって異なります。一部のプログラムは、信号(HUPなど)を送信すると、ログファイルを閉じて再度開きます。これを使用すると、サービスを中断することなく、ログレコードが「削除された」ログファイルに書き込まれるのを防ぐことができます。

ログファイルのサイズを管理するために利用できるユーティリティはたくさんあります。例えば logrotate

一部のプログラムには独自のユーティリティがあります。たとえば、Apache Webサーバーには rotatelogs ユーティリティが含まれています。

11
RedGrittyBrick

このタスクはsedで達成できると思います

sed -i '1,10d' myfile

1から行を削除しますst 10に番目 ファイルからの行。

私は誰もが少なくとも this sed 1 liners を見るべきだと思います。

これは、(質問で述べたように)アプリケーションによってアクティブに追加されているログファイルには機能しないことに注意してください。

sed -iは、新しいファイルを作成し、書き込まれているファイルを「削除」します。ほとんどのアプリケーションは、削除されたログファイルにログレコードを書き込み続け、ディスク領域を使い続けます。新しい、切り捨てられたログファイルは追加されません。これは、アプリケーションが再起動されるか、ログファイルを閉じて再度開くように通知された場合にのみ停止します。 sedの使用とアプリケーションの再起動の間にログ可能なアクティビティがあった場合、その時点で新しいログファイルにギャップ(ログレコードが欠落)があります。

これを行う安全な方法は、アプリケーションを停止し、sedを使用してログをトランケートしてから、アプリケーションを再起動することです。このアプローチは、一部のサービス(たとえば、高スループットと高いサービス継続性要件を備えたWebサーバー)では受け入れられない場合があります。

25
l1zard

いいえ。ログファイルの増加というこの一般的な問題の解決策は、ログローテーションです。これには、既存のログファイルを他のファイル名に定期的に(毎晩または毎週、通常)移動し、空のログファイルから新しく開始することが含まれます。しばらくすると、古いログファイルは破棄されます。

参照: http://www-uxsup.csx.cam.ac.uk/~jw35/courses/Apache/html/x1670.htm

5
Tarnay Kálmán

これは回答であり、解決策ではありません。質問に対する解決策はありません。質問者は次のように明確に述べています: "アクティブに追加されているログからアプリケーションによって」。詳細を読んで最後までスキップして、自分の推定に基づいて行う提案をスキップできます。このコードがロギングのベストプラクティスに従っていない理由.

明確にするために:ここでの他の「答え」はfalse promiseを提供します。名前を変更しても、アプリケーションが新しいファイルを使用するようにだまされることはありません。最も有用な情報は、これらの不正解に対するコメントに埋め込まれています。

ACTIVEファイルは、単にデータを入れるコンテナの一種ではありません。ファイル名は1つのiノード(ファイルの先頭)を指し、すべてのiノードには別のiノードへのポインタがあります(データがある場合)。つまり、継続的に書き込まれるファイルには、一定のストリームのiノードが追加されており、「ファイル」と考えるのは、実際にはiノードのログシーケンスです。

Googleマップで誰かを追跡していて、その人がいつでも世界中のどこにでもテレポートできると想像してください。

Linuxツールの「truncate」は、iノードツリーを歩くだけでファイルの最後にあるデータを破棄でき、(指定した場所/サイズで)スタック内の後続のすべてのポインターを破棄します。逆を行うには、ファイルのstartでデータを破棄します。これは、inodeツリーを実際に書き換える、非常に複雑で危険なプロセスになります。時間は、誰もそのようなツールを一般向けに書くことはないでしょう。なぜなら、それらはしばしば失敗し、データの損失につながるからです。 Inodes wiki は短いですが、これらの概念のいくつかを説明しています。

**私のアドバイス:この問題をひっくり返します-なぜこのアプリケーションはこのように動作しているのですか?ロギングのベストプラクティスは多数ありますが、多くの場合、ロギングシステムは実際のシステム(syslogなど)に関連しています。コアでは、アプリケーションはファイルへのハンドルを「解放」することが期待されるため、logrotate(など)は古いデータのさらなる処理を処理できます。

「アクティブなログファイルへ」と聞いたときはいつでも、私はすぐにその人にこのアプリケーションの背後にある「特別な話」を教えてくれるよう頼みます。通常、これは開発者が終了したため、コードを変更できません。これは実際には安全の逆であり、独自のリスクがあります。しかし、ソースコードに触れないようにするソリューションが必要です。これが場合、より具体的な質問が必要です。

2
Scott Prive

崇高なテキストで開く行を削除してファイルを保存することは、ファイルが追加されている場合でも、何とか機能しますが、コマンドラインソリューションのソリューションを検索するためにここに来たので、ここではこの機能は有効ですが役に立たないソリューションを残します!!

0