Serilog - 输出/使用从中调用日志条目的MethodName的所有消息

Aar*_*ver 9 vb.net serilog

无论如何,使用方法名称来丰富所有Seri​​log输出.

对于实例,请考虑如果我有以下内容;

Public Class MyClassName

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

End Class
Run Code Online (Sandbox Code Playgroud)

期望的输出如下;

2015-04-06 18:41:35.361 +10:00 [Information] [MyFunctionName] Hello World!
Run Code Online (Sandbox Code Playgroud)

实际上,完全合格的名字会很好.

2015-04-06 18:41:35.361 +10:00 [Information] [MyClassName.MyFunctionName] Hello World!
Run Code Online (Sandbox Code Playgroud)

似乎"Enrichers"仅对静态信息有用,并且每次都不起作用.

Mov*_*GP0 14

如果您需要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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这样:

Logger.Here().Information("Hello, world!");
Run Code Online (Sandbox Code Playgroud)

请记住在消息模板中添加这些属性.你可以使用这样的东西:

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();
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。我根据您的答案发布了一个完整的示例[此处](/sf/ask/3378819811/#48272467)。 (2认同)

Nic*_*rdt 12

通过反映调用堆栈可以通过扩展来实现这一点,但这样做非常昂贵,因此Serilog不提供它.

相反,你可以使用类似的东西:

Logger.Here().Information("Hello, world!");
Run Code Online (Sandbox Code Playgroud)

并实现该Here()方法作为扩展方法ILogger:

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

    Return logger.ForContext("MemberName", memberName)
End Sub 
Run Code Online (Sandbox Code Playgroud)

  • https://github.com/Fody/Anotar也可以自动为Serilog执行此操作. (4认同)

lit*_*tex 7

基于MovGP0 的答案(对于 C#),

我创建了一个解决方案,不需要Here()在要记录的每一行中使用 -Method,只需将自定义Log.cs-Class 添加到项目的“根命名空间”中即可。

有关更多信息,请参阅:https://gist.github.com/litetex/b88fe0531e5acea82df1189643fb1f79

  • ...所以您基本上为 Serilog 创建了一个包装器。有效,但很可能不是每杯茶。 (5认同)
  • Serilog 使用消息模板: [message-template-recommendations](https://github.com/serilog/serilog/wiki/Writing-Log-Events#message-template-recommendations) 有了上述要点,您就不需要不再有该消息模板,因为您只能传递单个字符串,这有点迫使您进行字符串插值,这是不建议的。 (3认同)