如何使用Serilog记录类名与方法名?原NLog用户技术咨询
解决Serilog记录类名、方法名的问题
Serilog支持捕获类名和方法名,以下是针对你需求的具体实现方案:
一、捕获类名(对应NLog的GetCurrentClassLogger)
在类中通过Log.ForContext<T>()创建绑定当前类的日志实例,Serilog会自动为其添加SourceContext属性(即类名):
private static readonly ILogger Logger = Log.ForContext<你的类名>();
接着在Serilog的输出模板中加入{SourceContext},即可在日志中打印类名。示例配置:
Log.Logger = new LoggerConfiguration() .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}") .CreateLogger();
二、捕获方法名
Serilog默认未自动捕获方法名,可通过两种简单方式实现:
方式1:利用C#调用方特性(无额外依赖)
在封装的日志方法中添加[CallerMemberName]参数,自动获取当前调用的方法名:
public static void LogInfo(string message, [CallerMemberName] string methodName = null) { Logger.Information("Method: {MethodName} - {Message}", methodName, message); }
调用LogInfo("测试日志")时,methodName会自动填充为当前调用的方法名。
方式2:使用Serilog扩展包自动注入
安装Serilog.Enrichers.WithCaller NuGet包后,在配置中添加对应Enricher,即可自动注入方法名:
Log.Logger = new LoggerConfiguration() .Enrich.WithCaller() .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {SourceContext}.{CallerMemberName} {Message:lj}{NewLine}{Exception}") .CreateLogger();
此时输出模板中的{CallerMemberName}会自动填充方法名,无需修改日志调用代码。
性能说明
上述方案的性能表现与你之前使用NLog的方式相近,不会产生明显性能损耗。
内容的提问来源于stack exchange,提问作者Aj.son
相关产品推荐
相关产品推荐

