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

如何将ForContext<T>的类型名添加到日志消息模板中?

如何让日志自动添加输出类的类名前缀(结合ForContext)

完全可以实现,不用每次日志调用手动写类名,通过配置日志模板+ForContext<T>就能自动给日志消息带上类名前缀,下面是具体实现方式:

1. 配置日志输出模板

以常用的Serilog为例,在初始化日志配置时,修改输出模板,把{SourceContext}(这个字段会被ForContext<T>自动填充为T的类型名)放在日志消息的前面:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}")
    .CreateLogger();

2. 在类中正确使用ForContext

像你给出的示例那样,注入ILogger后,通过ForContext<T>创建当前类专属的日志实例,之后所有日志调用都会自动带上类名。注意要把日志实例存为类的私有字段,避免覆盖参数:

public class Foo
{
    private readonly ILogger _logger;

    public Foo(ILogger logger)
    {
        _logger = logger.ForContext<Foo>();
    }

    public void DoSomething()
    {
        _logger.Information("Bar"); // 最终日志会输出类似:[14:30:00 INF] [Foo] Bar
    }
}

3. 原生Microsoft日志框架的替代方案

如果用的是Microsoft.Extensions.Logging原生框架,也可以通过配置日志格式+Scope实现类似效果。比如在appsettings.json里配置:

{
  "Logging": {
    "Console": {
      "FormatterOptions": {
        "IncludeScopes": true,
        "TimestampFormat": "[HH:mm:ss] "
      }
    }
  }
}

然后在类中开启Scope:

public class Foo
{
    private readonly ILogger _logger;

    public Foo(ILogger<Foo> logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        using (_logger.BeginScope("[{0}]", typeof(Foo).Name))
        {
            _logger.LogInformation("Bar");
        }
    }
}

不过这种方式需要手动管理Scope,不如Serilog的ForContext<T>简洁。

内容的提问来源于stack exchange,提问作者Bent Rasmussen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:43:20