構造化されたアプローチには2つの基本的な進歩があり、追加の努力なしで(場合によっては極端なレベルの)テキストログを使用してエミュレートすることはできません。
イベントの種類
log4netで次のような2つのイベントを作成する場合:
log.Debug("Disk quota {0} exceeded by user {1}", 100, "DTI-Matt");
log.Debug("Disk quota {0} exceeded by user {1}", 150, "nblumhardt");
これらは同様のテキストを生成します:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
しかし、マシン処理に関する限り、それらは異なるテキストの2行にすぎません。
すべての「ディスククォータ超過」イベントを検索することもできますが、イベントを探すという単純なケースは、次のlike 'Disk quota%'
ような別のイベントが発生するとすぐに失敗します。
Disk quota 100 set for user DTI-Matt
テキストロギングは、イベントのソースについて最初に持っていた情報を破棄します。通常は、より複雑な一致表現でログを読み取るときに、これを再構築する必要があります。
対照的に、次の2つのSerilogイベントを作成する場合:
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
これらは、log4netバージョンと同様のテキスト出力を生成しますが、舞台裏では、"Disk quota {Quota} exceeded by user {Username}"
メッセージテンプレートは両方のイベントによって伝達されます。
適切なシンクを使用すると、後でクエリwhere MessageTemplate = 'Disk quota {Quota} exceeded by user {Username}'
を記述し、ディスククォータを超えたイベントを正確に取得できます。
すべてのログイベントでメッセージテンプレート全体を保存することは必ずしも便利ではないため、シンクによってはメッセージテンプレートを数値EventType
(たとえば0x1234abcd
)にハッシュするか、ログパイプラインにエンリッチャーを追加して自分でこれを行うことができます。
以下の次の違いよりも微妙ですが、大量のログボリュームを処理する場合は非常に強力な違いです。
構造化データ
ここでも、ディスク領域の使用に関する2つのイベントを考慮すると、テキストログを使用してを使用して特定のユーザーを照会するのは簡単like 'Disk quota' and like 'DTI-Matt'
です。
しかし、生産診断は必ずしも簡単ではありません。ディスククォータを超過したイベントが125 MB未満であるイベントを見つける必要があると想像してください。
Serilogでは、これはほとんどのシンクで次のバリアントを使用して可能です。
Quota < 125
正規表現からこの種のクエリを構築することは可能ですが、手間がかかり、通常は最終手段の手段になります。
次に、これにイベントタイプを追加します。
Quota < 125 and EventType = 0x1234abcd
ここで、これらの機能がどのように簡単な方法で組み合わされて、ログを使用した実稼働デバッグが最高の開発アクティビティのように感じられるかを確認し始めます。
もう1つの利点は、おそらく前もって簡単に防ぐことはできませんが、生産デバッグが正規表現ハッカーの土地から取り除かれると、開発者はログをより重視し、それらを記述する際により多くの注意と配慮を行使し始めます。より良いログ->より質の高いアプリケーション->あらゆる場所でより幸せに。