web-dev-qa-db-ja.com

ほとんどのログファイルがバイナリ形式ではなくプレーンテキストを使用するのはなぜですか?

ロギングは必要ですが、(比較的)ほとんど使用されません。そのため、保管の点ではるかにコンパクトにすることができます。

たとえば、最も一般的に記録されるデータは、IP、日付、時刻、および整数として表すことができるその他のデータのように、テキストとして保存されます。

ログがバイナリデータとして保存された場合、特に書き込みが制限されているSSDを使用すると、多くのスペースを維持できるため、ローテーションが少なくなり、ディスクの寿命が長くなります。

それはそれほど重要ではない小さな問題だと言う人もいるかもしれませんが、そのようなメカニズムを構築するために必要な労力を考慮すると、意味がありません。誰もが彼の余暇に2日間のようにこれを作ることができます、なぜ人々はこれをしないのですか?

82
php_nub_qq

systemdは、ログファイルをバイナリ形式で保存することで有名です。私が聞いた主な問題は次のとおりです。

  1. ログが破損すると、専門のツールが必要になるため、回復が困難になります。
  2. 人間が読める形式ではないため、vigreptailなどの標準ツールを使用して分析することはできません

(私の知る限り)バイナリ形式を使用する主な理由は、インデックスの作成など、データベースファイルのように扱う方が簡単だと考えられていたためです。

ディスクスペースの利点は実際には比較的小さい(そして減少している)と私は主張します。大量のログを保存する場合は、ロールされたログの圧縮が非常に効率的です。

結局のところ、ほとんどの場合、ツールと親しみやすさの利点は、おそらくテキストロギングの側面で誤ります。

163
Alex

ほとんどのログファイルがバイナリ形式ではなくプレーンテキストを使用するのはなぜですか?

nix philosophy ウィキペディアの記事で「テキスト」という単語を検索します。たとえば、次のようなステートメントが見つかります。

Bell Labs CSRC(コンピューティングサイエンスリサーチセンター)の責任者であり、Unixパイプの発明者であるMcIlroyは、Unixの哲学を次のように要約しました:[10]

これは、Unixの哲学です。1つのことを行い、それをうまく行うプログラムを作成します。一緒に動作するプログラムを作成します。テキストストリームを処理するプログラムを作成します。これは、汎用インターフェイスであるためです。

または、たとえば nix哲学の基礎 から、

構成のルール:他のプログラムと接続する設計プログラム

どのプログラムも互いに通信できない場合、複雑すぎるモノリスのプログラミングを回避するのは困難です。

Unixの伝統は、単純なテキスト形式のストリーム指向のデバイスに依存しない形式を読み書きするプログラムを書くことを強く推奨しています。古典的なUnixでは、できるだけ多くのプログラムが単純なフィルターとして作成されます。フィルターは、入力時に単純なテキストストリームを受け取り、出力時に別の単純なテキストストリームに処理します。

一般的な神話にも関わらず、Unixプログラマーがグラフィカルユーザーインターフェイスを嫌うため、この方法は好まれません。これは、単純なテキストストリームを受け入れて出力するプログラムを作成しないと、プログラムをフックするのがはるかに困難になるためです。

メッセージはオブジェクト指向設定のオブジェクトに対するものであるので、テキストストリームはUnixツールに対するものです。テキストストリームインターフェイスのシンプルさは、ツールのカプセル化を強化します。リモートプロシージャコールなど、より複雑なプロセス間通信の形式では、プログラムの相互の内部関係が複雑になる傾向があります。

誰もが彼の余暇に2日間のようにこれを作ることができます、なぜ人々はこれをしないのですか

バイナリでログファイルを保存することは、ほんの始まりにすぎません(そして些細なことです)。次に、次のようなツールを作成する必要があります。

  • ログファイル全体を表示(edit
  • ログの先頭を読み取らずに、ログの末尾を表示します(tail -f
  • ファイル(grep)の内容を検索します
  • 選択した/興味深いもののみを表示するためのフィルター(任意に複雑なフィルター式を使用)
  • Log-file-decoder-softwareを持っていない誰かにログをメールで送信する
  • ログファイルのフラグメントをコピーして貼り付ける
  • (ログファイルを作成する)プログラムがまだ開発およびデバッグされている間に、ログファイルを読み取ります。
  • 古いバージョンのソフトウェア(顧客サイトに展開され、実行されている)からログファイルを読み取ります。

明らかにソフトウェアはバイナリファイル形式も使用できます(リレーショナルデータベースなど)が、価値はありません( [〜#〜] yagni [〜#〜] の意味で)。通常、実行する価値はありません。ログファイル。

89
ChrisW

ここには議論の余地のある推測がたくさんあります。

ロギングは、私がこれまでに経験した(ほぼ)すべての仕事の不可欠な部分です。アプリケーションの正常性について何らかの可視性が必要な場合は不可欠です。それが「フリンジ」の使用であるとは思えません。私が関わってきたほとんどの組織は、ログを非常に重要だと考えています。

ログをバイナリとして保存するということは、ログを読み取る前にデコードする必要があるということです。テキストログは、シンプルで使いやすいという長所があります。バイナリルートを検討している場合は、代わりにデータベースにログを保存することもできます。データベースに問い合わせて、統計的に分析できます。

SSDは、現在のHDDよりも信頼性が高く、大量の書き込みに対する議論は大部分が議論の余地があります。本当に心配な場合は、ログを通常のHDDに保存してください。

49
Robert Harvey

ログファイルは、深刻なアプリケーションの重要な部分です。アプリへのログインが適切である場合、どのキーイベントがいつ発生したかを確認できます。どのエラーが発生したか。そして、一般的なアプリケーションの正常性は、監視が設計されているものを超えています。問題について聞いて、アプリケーションの組み込み診断を確認し(Webコンソールを開くか、JMXなどの診断ツールを使用して)、次に、ログファイル。

非テキスト形式を使用すると、すぐにハードルに直面します。バイナリログをどのように読み取るのですか。本番サーバーにはないログ読み取りツールを使用してください!それともそうですが、親愛なる、私たちは新しいフィールドを追加しました。これをテストしませんでしたか?はい、しかし誰もそれをここに配備しませんでした。その間、ユーザーからpingが送信されると、画面が明るくなります。

または、これはあなたのアプリではないかもしれませんが、サポートを行っていて、それがこの別のシステムであり、WTFであると知っていると思いますか?ログはバイナリ形式ですか?さて、wikiページを読み始めて、どこから始めますか?今、私はそれらをローカルマシンにコピーしましたが、それらは壊れていますか?バイナリ以外の転送を行ったことがありますか?または、ログ読み取りツールがめちゃくちゃになっていますか?

つまり、テキスト読み取りツールはクロスプラットフォームでユビキタスであり、ログはしばしば長寿命であり、急いで読み取る必要がある場合があります。バイナリ形式を発明すると、よく理解された使いやすいツールの世界全体から切り離されてしまいます。必要なときに機能が深刻に失われる。

ほとんどのロギング環境は妥協します。現在のログを読み取り可能にして存在させ、古いログを圧縮します。つまり、圧縮のメリットが得られます。実際、バイナリ形式ではログメッセージが圧縮されないためです。同時に、lessおよびgrepなどを使用できます。

では、バイナリを使用することでどのような利点が得られるのでしょうか?少量のスペース効率-ますます重要ではなくなります。書き込みが少ない(または少ない)ですか?まあ、多分-実際には、書き込みの数はディスクコミットの数に関係するため、ログ行がディスクのブロックサイズよりも大幅に小さい場合、SSDは新しいブロックを繰り返し割り当てます。したがって、バイナリは次の場合に適切な選択です。

  • あなたは大量の構造化データを書いています
  • ログは特に迅速に作成する必要があります
  • 「サポート条件」の下でそれらを分析する必要はほとんどありません

しかし、これはアプリケーションのロギングのようには聞こえません。これらは出力ファイルまたはアクティビティレコードです。それらをファイルに格納することは、おそらくデータベースに書き込むのにほんの一歩です。

[〜#〜]編集[〜#〜]

ここでは、「プログラムログ」(ロギングフレームワークごと)と「レコード」(アクセスログ、ログインレコードなど)の間で一般的な混乱があると思います。私は質問が後者に最も密接に関連していると私は推測し、その場合、問題ははるかに明確にされていません。メッセージレコードまたはアクティビティログがコンパクトな形式であることは完全に許容できます。特に、明確に定義され、トラブルシューティングではなく分析に使用される可能性が高いためです。これを行うツールには、tcpdumpおよびUnixシステムモニターsarが含まれます。一方、プログラムログは、その場限りの傾向があります。

36
SusanW

ややバイナリのログの例として、Windowsイベントログが広く普及しています。プロ側では、これにより、実質的に無料で、おそらく次のようなログメッセージを非常に冗長な(したがって、うまくいけば役立つ)ことができます

警告:実行するfoobarのキューは、過去90秒間で517アイテム増加しています。これが1日に1回程度発生する場合、心配する必要はありません。それがより頻繁に、または連続して発生する場合は、foobarアプリケーションで使用可能なRAMの量を確認することをお勧めします。ただし、イベント12345とともに発生する場合は、旧式のデータベース。データの損失を防ぐために、+ 1-555-12345でサポートに連絡することをお勧めします。

このメッセージの主要部分は、アプリケーションと共にインストールされるリソースとして一度だけ存在します。ただし、このリソースが正しくインストールされていない場合(たとえば、この古いメッセージをサポートしていない新しいバージョンがインストールされているため)、イベントログに表示されるのは、単なる空想的な標準メッセージです

ダンノ、「517」と「90」の何か。

もはや何の役にも立たない。

9

TL; DR:サイズは重要ではありませんが、使用の利便性は重要です

まず第一に、短期のログ保存のためのテキスト形式とバイナリ形式のそれぞれの利点を比較することは重要な問題ですが、サイズはそれほど重要ではありません。これには2つの理由があります。

  1. ログは非常に冗長な情報であり、非常によく圧縮されます。私の経験では、元のファイルのサイズの5%以下のサイズの圧縮ログファイルが表示されることは珍しくありません。したがって、テキストまたはバイナリ形式を使用しても、ログの長期保存に測定可能な影響はありません。

  2. どの形式を選択しても、ログファイルを圧縮して長期ストレージプラットフォームに送信する「ログファイルシンク」を実装しない場合、ログはすぐにサーバーディスクをいっぱいにします。バイナリ形式を使用すると、これが少し遅くなる可能性がありますが、係数10による変更でさえ、それほど重要ではありません。

テキスト形式とバイナリログ形式

Unixシステムの約束は、grepsortjoinsedおよびawk–これらを使用して、ゆっくりと大まかにではありますが、必要なジョブを実行するプロトタイプをすばやく組み立てることができます。プロトタイプがその有用性を実証したら、実際に設計されたソフトウェアに変換して、パフォーマンスを得たり、その他の有用な機能を追加したりできます。これは、少なくとも私の理解では、Unix哲学の本質です。

別の言い方をすれば、今日までには理解できない処理や分析を実行する必要がある場合、この分析を誰が実装すべきかわからない場合などは、プロトタイプとテキスト形式を使用する段階にあります。ログはおそらく最適です。特定された少数の一連の処理を繰り返し実行する必要がある場合、この分析を実行するために多年生のソフトウェアシステムを設計する必要がある状況にあり、リレーショナルデータベースなどのログのバイナリ形式または構造化形式は、最適な。

(少し前に、これについて ブログ投稿 を書きました。)

テキストとバイナリのどちらかを選択する前に確認したい2つの主な質問は次のとおりです。

  • 私の聴衆は誰ですか?
  • どのようなコンテンツを伝える必要がありますか?

一般的な意見は、ログメッセージの対象者は人間であるというものです。ログクロールスクリプトは多数存在するため、これは完全な仮定ではありませんが、一般的なものです。この場合、人間が快適な媒体で情報を伝えることは理にかなっています。テキストはこの媒体であるという長い間伝統があります。

コンテンツに関しては、バイナリログmustが明確に定義されたフォーマットを持っていることを考慮してください。他の人がそれらのログを操作するソフトウェアを作成できるように、フォーマットは十分に定義されている必要があります。一部のログは非常によく構造化されています(質問にはいくつかのリストがあります)。他のログでは、あまり明確に定義されていない自然言語形式でコンテンツを伝達する機能が必要です。このような自然言語の場合は、バイナリ形式には適していません。

バイナリで適切に記述できるログについては、選択する必要があります。テキストは誰にとっても機能するため、多くの場合、デフォルトで選択されています。結果をテキストで記録すると、他のユーザーがあなたのログを操作できるようになります。それは何千回も証明されています。バイナリファイルは扱いにくいです。その結果、開発者がテキストを出力するのは、誰もがそれがどのように動作するかを知っているからです。

5
Cort Ammon

ログファイルは、任意のタイプのテキストエディターを使用して、またはコンソールコマンドで内容を表示することで簡単に読み取ることができるため、テキスト形式です。

ただし、多くのデータがある場合、一部のログファイルはbinary形式です。たとえば、私が作業している製品には、最大15000レコードが格納されます。最小限のスペースでレコードを保存するために、レコードはバイナリで保存されます。ただし、レコードを表示したり、使用可能な形式(スプレッドシートなど)に変換したりするには、特別なアプリケーションを作成する必要があります。

要約すると、すべてのログファイルがテキスト形式であるとは限りません。テキスト形式には、コンテンツを表示するためにカスタムツールが必要ないという利点があります。大量のデータがある場合、ファイルはbinary形式である可能性があります。バイナリ形式では、データを読み取って人間が読める形式で表示する(カスタム)アプリケーションが必要です。より多くのデータをバイナリ形式にパックできます。テキスト形式とバイナリ形式のどちらを使用するかは、データ量とコンテンツの見やすさに基づいて決定されます。

4
Thomas Matthews

破損したテキストファイルは、破損した部分の周囲で引き続き読み取ることができます。破損したバイナリファイルは復元できる可能性がありますが、復元できない場合もあります。復元可能であっても、かなりの作業が必要になります。もう1つの理由は、Rush中に「一時的な修正」(別名「すべての修正のうち最も永続的な修正」)を作成する可能性がバイナリロギング形式になるため、より速く作成できるものではなく、ログソリューションが使用される可能性が低くなるためです。

3

実行時に使用可能な出力チャネルがない可能性がある組み込みシステムでは、アプリケーションはロギングによって課せられるスピードヒットを提供できません。または、ロギングは記録しようとしている効果を変更またはマスクします。バイナリデータを配列またはリングバッファーに詰め込み、テスト実行の最後にそれをprintf()するか、生データをダンプしてインタープリターを作成して読み取り可能として出力しました。いずれにせよ、最終的には読み取り可能なデータにしたい。

より多くのリソースを持つシステムで、最適化する必要のないものを最適化するスキームを発明する理由は何ですか?

3
JRobert

ログファイルは、問題のデバッグを支援することを目的としています。通常、ハードドライブの容量はエンジニアリング時間よりもはるかに安価です。テキストを処理するための多くのツール(tail -fなど)があるため、ログファイルはテキストを使用します。 HTTPでも平文を使用します( http のテキストの代わりにバイナリを送信しない理由も参照)。

さらに、プレーンテキストのロギングシステムを開発して機能することを確認する方が安く、システムが故障した場合のデバッグが容易で、システムに障害が発生してログの一部が破損した場合に役立つ情報を簡単に回復できます。

3
Casey Kuball

歴史的に、ログはイベントの公式な手書きの連続した記録でした。機械がイベントを記録できるようになると、これらはテレタイププリンターなどのハードコピー出力デバイスに書き込まれ、永続的なシーケンシャルレコードが生成されましたが、テキストしか処理できず、ベルを鳴らすこともありました...

2
Chris_F

私のメインフレーム時代には、カスタム設計のバイナリログ形式を使用していました。主な理由は、スペースを節約することではなく、古いエントリーを新しいエントリーで上書きして、ログが有限のスペースを占めるようにしたかったからです。私たちが欲しかった最後のことは、ディスクがいっぱいになることによって引き起こされる問題を診断できないことでした(1980年にはディスク容量が$ 1000/Mbだったため、人々は必要以上に購入していませんでした)。

今でも循環ログファイルのアイデアが気に入っています。オペレーティングシステムがそのような獣を提供した場合、私はためらうことなくそれを使用します。しかし、バイナリは悪い考えでした。解決すべき重大な問題が発生したときに、ログファイルを解読するための適切なコマンドを見つけるために時間を無駄にする必要はありません。

2
Michael Kay

私たちは、ソフトウェアの堅牢性を達成および維持するための単体テストに頼っています。 (コードのほとんどはヘッドレスサーバーで実行されます。ログファイルの操作後の分析は重要な戦略です。)実装のほぼすべてのクラスがログを記録します。ユニットテストの重要な部分は、ユニットテスト時に使用される「モック」ロガーの使用です。単体テストはモックロガーを作成し、テスト対象のアイテムに提供します。次に、(有用/適切な場合に)ログに記録されたもの(特にエラーと警告)を分析します。テキストベースのログ形式を使用すると、「実際の」ログに対して分析を実行するのと同じ理由で、これがはるかに簡単になります。使用してすぐに適応できるツールが他にもあります。

2
Art Swri