web-dev-qa-db-ja.com

Serilogログをコンテキストソースに応じて異なるシンクにフィルターしますか?

Serilogをログに正常に使用する.NET Core 2.0アプリケーションがあります。今、私はいくつかのデータベースパフォーマンス統計を別のシンクに記録したいと思います(これらはデバッグのためではなく、これは基本的にアプリケーションの他のすべてのログの目的であるため、それらを別々に保ちたい) Log.ForContext<MyClass>()を使用してDB統計ロガーを作成します。

Serilogの設定方法がわからないappsettings.jsonを使用「デバッグログ」を1つのシンクに、DB統計ログを別のシンクに記録しますか?私は次のようなことができることを望んでいます:

"Serilog": {
  "WriteTo": [
    {
      "Name": "RollingFile",
      "pathFormat": "logs/Log-{Date}.log",
      "Filter": {
        "ByExcluding": "FromSource(MyClass)"
      }
    },
    {
      "Name": "RollingFile",
      "pathFormat": "logs/DBStat-{Date}.log",
      "Filter": {
          "ByIncludingOnly": "FromSource(MyClass)"
      }
    }
  ]
}

構成の"Filter"部分は、私の側では単なる当て推量です。これは構成ファイラーを使用して可能ですか、またはStartup.csファイルのコードでこれを行う必要がありますか?

編集:C#APIを使用して動作していますが、JSON設定を使用してそれを把握したいです:

Log.Logger = new LoggerConfiguration()
            .WriteTo.Logger(lc => lc
                .Filter.ByExcluding(Matching.FromSource<MyClass>())
                .WriteTo.LiterateConsole())
            .WriteTo.Logger(lc => lc
                .Filter.ByExcluding(Matching.FromSource<MyClass>())
                .WriteTo.RollingFile("logs/DebugLog-{Date}.log"))
            .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(Matching.FromSource<MyClass>())
                .WriteTo.RollingFile("logs/DBStats-{Date}.log", outputTemplate: "{Message}{NewLine}"))
            .CreateLogger();
18
David Nordvall

今日、この作業を完了し、これを整理するためにかなりの数の投稿、問題、およびその他のページを処理する必要があるため、適切な回答を提供すると思いました。

すべてのログを保持しておくと便利ですが、APIコードのみを個別にログに記録し、Microsoft.名前空間ログを省略したいと考えました。そのためのJSON構成は次のようになります。

  "Serilog": {
    "Using": [ "Serilog.Sinks.File" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/var/logs/system.log",
          ... //other unrelated file config
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "/var/logs/api.log",
                  ... //other unrelated file config
                }
              }
            ],
            "Filter": [
              {
                "Name": "ByExcluding",
                "Args": {
                  "expression": "StartsWith(SourceContext, 'Microsoft.')"
                }
              }
            ]
          }
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
    ... //Destructure and other config
  }

最上位のWriteToは、最初の単純なグローバルシンクです。すべてのログイベントがこれに書き込みます。これと同じレベルにFilterセクションを追加すると、構成されているすべてのWriteTo要素に影響します。

次に、別のWriteToLoggerFileではなく)として構成しますが、これのArgsは異なって見え、configureLogger要素がありますこれは、最上位のSerilogと同じ目的を果たします。つまり、サブロガーの最上位です。これは、この構成を簡単に別のファイルに分割し、構成ビルダーに追加できることを意味します(下を参照)。

ここから、このサブロガーは同じように機能します。複数のWriteTosを構成でき、このレベルのFilter要素はこのサブロガーのみに影響します。

単に"Name": "Logger"要素をトップレベルWriteToセクションに追加し、各要素のフィルターを個別に設定するだけです。

configでこれをすべて実行し、コード内のSerilog.Filters.Expressionsパッケージの1ビットを参照しない場合でも、NuGetを追加する必要があることに注意することも重要です。そのパッケージへの参照。 パッケージ参照なしでは機能しません

設定の分割について:

ロガーをさらに追加する必要がある場合は、明確にするために、異なるロガーを明確に別々のファイルに分割します。

appsettings.json:

  "Serilog": {
    "Using": [ "Serilog.Sinks.File" ],
    "MinimumLevel": "Error",
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/var/logs/system.log",
          ...
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {} // leave this empty
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    ...

apilogger.json:

{
  "Serilog:WriteTo:1:Args:configureLogger": {   //notice this key
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/var/logs/api_separateFile.log",
          ...
        }
      }
    ],
    "Filter": [
      {
        "Name": "ByExcluding",
        "Args": {
          "expression": "StartsWith(SourceContext, 'Microsoft.')"
        }
      }
    ]
  }
}

IWebHostビルダーを調整して、追加の構成を含めます。

    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("apilogger.json", optional: false, reloadOnChange: false);
        })
        .UseStartup<Startup>();

これにより、理解、読み取り、および保守が容易になります。

12
helloserve