Vb.net Serilog—使用调用日志项的MethodName输出/充实所有消息

Vb.net Serilog—使用调用日志项的MethodName输出/充实所有消息,vb.net,serilog,Vb.net,Serilog,是否仍然可以使用方法名来丰富所有Serilog输出 例如,如果我有以下内容,请考虑:p> 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 [Inform

是否仍然可以使用方法名来丰富所有Serilog输出

例如,如果我有以下内容,请考虑:p>
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!

“enricher”似乎只适用于静态信息,并且不会每次都起作用。

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

此处的公共Sub(ByVal logger作为ILogger,
可选成员名称(字符串=无)
返回logger.ForContext(“MemberName”,MemberName)
端接头

如果您需要C语言版本:

公共静态类LoggerExtensions
{
此处为公共静态ILogger(此ILogger记录器,
[CallerMemberName]字符串memberName=“”,
[CallerFilePath]字符串sourceFilePath=“”,
[CallerLineNumber]int sourceLineNumber=0){
返回记录器
.ForContext(“MemberName”,MemberName)
.ForContext(“文件路径”,sourceFilePath)
.ForContext(“行号”,sourceLineNumber);
}
}
这样使用:

//在类的开头
私有静态Serilog.ILogger Log=>Serilog.Log.ForContext();
//在方法中
Log.Here().Information(“你好,世界!”);
记住在消息模板中添加这些属性。您可以使用以下内容:

var outputTemplate=“[{Timestamp:HH:mm:ss}{Level}]{SourceContext}{NewLine}{Message}{NewLine}方法{MemberName}在{FilePath}:{LineNumber}{NewLine}{Exception}{NewLine}中”;
Logger.Logger=新的LoggerConfiguration()
.MinimumLevel.Warning()
.Enrich.FromLogContext()的
.WriteTo.RollingFile(“log/{Date}.log”,outputTemplate,LogEventLevel.Warning)
.WriteTo.Console(LogEventLevel.Warning,outputTemplate,主题:AnsiConsoleTheme.Literate)
.CreateLogger();

在Serilog的输出模板中,配置日志以写入
属性。方法名称将作为
ActionName
列的一部分写入

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

配置
Properties/ActionName
将方法名称写入
名称空间.ClassName.MethodName
格式。

可以简化C#上的版本。只需使用AutoFacseriLoginIntegration:

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));
基于(对于C#))

我创建了一个解决方案,通过在项目的“根命名空间”中添加一个自定义的
log.cs
-类,不需要在要记录的每一行中都使用
Here()
-方法


有关更多信息,请参阅:

OK这将起作用。但我想知道这会增加多少开销。。这似乎是大多数日志库的一个基本特性。如果这只是一个内置的enricher或配置选项,那就太好了。。。默认情况下关闭,但如果人们准备接受打击,那么他们可以打开它。这将消除不断编写代码来调用扩展方法的要求现在有一个基于enricher的方法的示例,在@NicholasBlumhardt中描述:@NicholasBlumhardt您可以用C#提供您的答案,并提供更多细节,比如如何在Ilogger etcThanks中实现这一点。我根据你的答案发布了一个完整的例子。仅供参考。。。我需要使用
Log.
,比如
Log.Logger.Here().Information(“你好,世界!”)
并且不要忘记使用
添加到扩展名称空间中。我更喜欢在类的开头使用类似的内容:
私有静态Serilog.ILogger Log=>Serilog.Log.ForContext()只是出于好奇,在.NET 5中不能用新的源代码生成器替换
Here()
方法吗?我想知道是否有办法使.NET Core的ILogger与Serilog的ILogger相反。您可以访问BeginScope,但我无法真正找到一种优雅的方法来实现它。。。。所以您基本上为Serilog创建了一个包装器。有效,但很可能不是每一杯茶。