例としてSerilogとSeqを使用した構造ロギング

シーケンス

構造ログは、通常のログに比べて一歩進んでいます。



アイデア



通常のログエントリは文字列で構成され、テキスト配列内のエントリを検索するには正規表現を使用する必要があります

_logger.Warning("   .    ID"+postId);
      
      







構造ログは、オブジェクト(構造)の形式でレコードを保存します。 たとえば、JSONを使用する

 _logger.Warning("   .    {ID}", postId);
      
      





2つのエントリが保存されます。

  1. 「ログファイルに書き込む」行の最終出力のテンプレート。 Habr {ID}に投稿»
  2. テンプレートで置換するオブジェクト:{"ID":1、type:Number}


このアプローチの主な利点は、整数IDオブジェクトを別のパラメーターとして、たとえばNoSqlデータベースに保存できるようになったことです。 また、正規表現を記述する代わりに、型付き比較演算を使用して便利で迅速な検索を実行します。



セリログ



構造ログをサポートする便利な.NETライブラリの1つはSerilogです。

このライブラリは、log4net、Nlog、および他の有名なライブラリが持つすべての基本的なロギング機能をサポートしています。





したがって、 Serilog Nugetパッケージをインストールした後、構成を構成します。 これは、.configファイルの代わりにコードで行います。

  var logger = new LoggerConfiguration() .MinimumLevel.Verbose() //     Verbose  ,    Information .WriteTo.ColoredConsole() //     .WriteTo.RollingFile(@"C:\Logs\Log-{Date}.txt") //     ,     //    Verbose    ,  , Error  Windows Event Logs .CreateLogger();
      
      







ロガーオブジェクトをディペンデンシーインジェクションに渡すか、すぐに使用することができます。

車を診断するためのプログラムを作成し、メーカー、シリーズ、摂取日に関する情報が必要だとします。 そしてもちろん、すべてが構造的な形で保存されるように。



 logger.Debug("Request for vehicles {Manufature}, {Series}, {ProductionYear}", "BMW", "F02", new DateTime(2015, 1,1)); // search returns 10 vehicles logger.Verbose("Found {FoundVehiclesCount}", 10);
      
      







コンソールとファイルへの出力を使用したため、結果は使い慣れた行の形式になります。





1つの便利な機能は、一般的に使用されるプロパティの追加です。 Webアプリケーションの場合、これはユーザーセッション、アクセスしたURL、ブラウザーデータです。 より一般的なケースでは、アプリケーションのバージョンを追加できます。 これを行うには、Enrichプロパティと既に組み込まれているクラスを使用するか、独自のクラスを作成します。



  var logger = new LoggerConfiguration() .Enrich.With<HttpRequestIdEnricher>() .Enrich.With<HttpRequestUrlEnricher>() .Enrich.With<HttpRequestUserAgentEnricher>() .Enrich.With<UserNameEnricher>(); .Enrich.WithProperty("ApplicationVersion", config.ApplicationVersion) .CreateLogger();
      
      







複雑なオブジェクトのコンソールまたはテキストファイルへの便利な出力のために、@記号を追加して、プリミティブ型ではなく複雑なオブジェクトを使用していることをSerilogテンプレートに伝えることをお勧めします。 それ以外の場合、typeof(MyClass).ToSting()が表示されます。

 logger.Debug("We are using anonymous object instead of simple string/integer {@Car}", new {Manufacture="Toyota", Production = new DateTime(2015, 1,1)});
      
      







シーケンス



Seqアプリケーションは、構造ログの便利な保管と検索のために役立ちます。

Seqは、REST要求を受け入れるWindowsサービスとして機能し、NoSqlデータベースに内部的にデータを保存します。



Seqのインストール後、 Serilog.Sinks.Seq Nugetパッケージもアプリケーションに追加する必要があります。 そして、SeqでSerilogを友達にします。

 var logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Seq("http://localhost:5341") .CreateLogger();
      
      







数字や日付の比較など、フィールドを簡単に検索できるようになりました





検索オプションは保存して、アプリケーションの他の部分で使用できます。 ダッシュボードへの環境の追加



また、MyAppアプリケーションバージョン1.2.1から正確に発生し、Repository.GetUserByIdAndPassword()メソッドで発生したエラーを表示するリアルタイムダッシュボードを追加できます。



ビジネス要件



新しくてファッショナブルで明るいプログラムと同様に、質問をして確認する必要があります。

「このプログラムはビジネスにどのようなメリットをもたらしますか?」、「どのような問題をどのような価格で解決しますか?」

多くの場合、ロギングに関して、目標は次のようになります。



最初の2つのポイントが詳細な記録と便利な検索によって解決される場合、エラーの報告はしばしばスキップされます。 これを「無知の冷静」と呼びます。 Windowsイベントログを開くと、ほとんどすべてのサーバーに重大なエラーが発生するプログラムがあることがわかりました。



Seq拡張機能を使用すると、進行中のイベントについて通知できます。 たとえば、重大なエラーが発生した場合、すぐにプログラマ/管理者にメッセージを送信します。 また、1日または1週間に発生したすべてのエラーのリストを送信します。 拡張機能は、Seq-> Settings-> Appsセクションで設定できます





構造ロギングの短所



構造ロギングの欠点は、検索を実行するパラメーターを決定する必要があることです。 その後、NoSqlインデックスの作成に使用されます。 パラメータを定義するのを忘れた場合、検索は正規表現による文字列の古いスキャンになります。

この方向への大きな一歩は、 Splunkアプリケーションになります。 アイデアは、文字列データを、絶対にあらゆる形式(アプリケーションログ、OSイベントなど)で収集することです。 そして、クエリとMap / Reduceによる結果の動的な構成に応じて、驚くべき改行が行われます。 Splunkは、データを収集および分析するための優れたインフラストラクチャであり、ロギングおよびこの記事のトピックを超えています。



All Articles