Serilog - Output/Enrich 所有具有从中调用日志条目的 MethodName 的消息
Serilog - Output/Enrich All Messages with MethodName from which log entry was Called
有没有用方法名称丰富所有 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" 只适用于静态信息,不会每次都有效。
可以通过反射调用堆栈来使用增强器来完成此操作,但这样做非常昂贵,因此 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
如果您需要 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();
在 Serilog 的 outputTemplate 中,配置日志写入 Properties
。方法名称将作为 ActionName
列的一部分写入。
ActionName
也可以在 outputTemplate 中单独配置(而不是所有属性)。
配置Properties/ActionName
将以Namespace.ClassName.MethodName
格式写入方法名。
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));
基于 (针对 C#),
我创建了一个解决方案,不需要在您要记录的每一行中使用 Here()
-方法,只需将自定义 Log.cs
-Class 添加到 "root namespace" 个项目。
有关详细信息,请参阅:https://gist.github.com/litetex/b88fe0531e5acea82df1189643fb1f79
有没有用方法名称丰富所有 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" 只适用于静态信息,不会每次都有效。
可以通过反射调用堆栈来使用增强器来完成此操作,但这样做非常昂贵,因此 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
如果您需要 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();
在 Serilog 的 outputTemplate 中,配置日志写入 Properties
。方法名称将作为 ActionName
列的一部分写入。
ActionName
也可以在 outputTemplate 中单独配置(而不是所有属性)。
配置Properties/ActionName
将以Namespace.ClassName.MethodName
格式写入方法名。
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));
基于
我创建了一个解决方案,不需要在您要记录的每一行中使用 Here()
-方法,只需将自定义 Log.cs
-Class 添加到 "root namespace" 个项目。
有关详细信息,请参阅:https://gist.github.com/litetex/b88fe0531e5acea82df1189643fb1f79