web-dev-qa-db-ja.com

Serilog-ログエントリが呼び出されたMethodNameを使用してすべてのメッセージを出力/強化します

とにかく、すべての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!

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

13
Aaron Glover

コールスタックを反映することでエンリッチャーを使用してこれを行うことは可能ですが、そうするのは非常に費用がかかるため、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 
_
12

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);
    }
}

このように使用します:

Logger.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();
13
MovGP0

MovGP0の回答 (C#の場合)に基づいて、

ルート名前空間にカスタム_Log.cs_-クラスを追加するだけで、ログに記録するすべての行にHere()-メソッドを必要としないソリューションを作成しました。

詳細については、以下を参照してください: https://Gist.github.com/litetex/b88fe0531e5acea82df1189643fb1f79

1
litetex

C#のバージョンは単純化できます。 AutofacSerilogIntegrationを使用するだけです。

var path = Server.MapPath("~/");

        var outputTemplate = "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} {Message} {NewLine}{Exception}";
        Log.Logger = new LoggerConfiguration()
                    .MinimumLevel.Debug()
                    .WriteTo.File($"{path}/log/serilog-.log", LogEventLevel.Debug, outputTemplate, rollingInterval: RollingInterval.Day)
                    .CreateLogger();

        var builder = new ContainerBuilder();
        builder.RegisterLogger();  // from AutofacSerilogIntegration
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
0
Sergey Fasolko

SerilogのoutputTemplateで、ログがPropertiesを書き込むように構成します。メソッド名はActionName列の一部として書き込まれます。

ActionNameは、outputTemplateで(すべてのプロパティではなく)個別に構成することもできます。

Properties/ActionNameを構成すると、メソッド名がNamespace.ClassName.MethodName形式で書き込まれます。

0
Jaya B.