You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:43:27