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!

似乎“Enrichers”只对静态信息有用,并且每次都不会起作用。

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 回答
4

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

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

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

于 2019-06-14T18:42:15.870 回答
0

在 Serilog 的 outputTemplate 中,配置要写入的日志Properties。方法名称将作为ActionName列的一部分写入。

ActionName也可以在 outputTemplate 中单独配置(而不是所有属性)。

配置会将方法名称以格式Properties/ActionName写入 。Namespace.ClassName.MethodName

于 2018-03-09T04:00:11.947 回答
0

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));
于 2018-07-09T17:08:19.937 回答