24

メソッド名を使用してすべての Serilog 出力を充実させる方法はありますか。

たとえば、次の場合を考えてみましょう。

Public Class MyClassName

  Private Function MyFunctionName() As Boolean
      Logger.Information("Hello World")
      Return True
  End Function

End Class

望ましい出力は次のようになります。

2015-04-06 18:41:35.361 +10:00 [Information] [MyFunctionName] Hello World!

実際には、完全修飾名が適しています。

2015-04-06 18:41:35.361 +10:00 [Information] [MyClassName.MyFunctionName] Hello World!

「エンリッチャー」は静的情報にのみ有効で、毎回機能しないようです。

4

5 に答える 5

29

C# のバージョンが必要な場合:

public static class LoggerExtensions
{
    public static ILogger Here(this ILogger logger,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0) {
        return logger
            .ForContext("MemberName", memberName)
            .ForContext("FilePath", sourceFilePath)
            .ForContext("LineNumber", sourceLineNumber);
    }
}

次のように使用します。

// at the beginning of the class
private static Serilog.ILogger Log => Serilog.Log.ForContext<MyClass>();

// in the method
Log.Here().Information("Hello, world!");

これらのプロパティをメッセージ テンプレートに追加することを忘れないでください。次のようなものを使用できます。

var outputTemplate = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}in method {MemberName} at {FilePath}:{LineNumber}{NewLine}{Exception}{NewLine}";

Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Warning()
            .Enrich.FromLogContext()
            .WriteTo.RollingFile("log/{Date}.log", outputTemplate, LogEventLevel.Warning)
            .WriteTo.Console(LogEventLevel.Warning, outputTemplate, theme: AnsiConsoleTheme.Literate)
            .CreateLogger();
于 2017-10-24T08:37:07.867 に答える
18

コール スタックをリフレクションすることでエンリッチャーを使用してこれを行うことは可能ですが、非常にコストがかかるため、Serilog では提供されていません。

代わりに、次のようなものを使用できます。

Logger.Here().Information("Hello, world!");

Here()の拡張メソッドとしてメソッドを実装しILoggerます。

<Extension>
Public Sub Here(ByVal logger as ILogger,
    <CallerMemberName> Optional memberName As String = Nothing)

    Return logger.ForContext("MemberName", memberName)
End Sub 
于 2015-04-07T21:30:41.007 に答える