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

时间:2015-04-06 12:00:57

标签: vb.net serilog

无论如何都要用方法名称来丰富所有Seri​​log输出。

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

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"只对静态信息有用,并且每次都不会工作。

5 个答案:

答案 0 :(得分:11)

如果您需要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();

答案 1 :(得分:10)

可以通过反映调用堆栈来实现这一点,但这样做非常昂贵,所以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 

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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));

答案 4 :(得分:0)

基于MovGP0's answer(对于C#),

我创建了一个不需要在您要登录的每一行都使用Here()-Method的解决方案,只需在根名称空间中添加自定义Log.cs-Class。

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