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

如何在编译时日志源生成代码中传入Serilog.ILogger而非Extensions.Logging?

使用Serilog.ILogger作为编译时日志分部方法的输入参数

要在编译时日志源生成场景下用Serilog.ILogger作为日志分部方法的输入,按以下步骤操作:

1. 安装必要的NuGet包

需要安装这几个核心包:

  • Serilog:Serilog核心日志库
  • Serilog.SourceGeneration:提供编译时源生成支持,避免反射开销
  • 可选输出包(比如Serilog.Sinks.Console):用来将日志输出到控制台,可根据需求替换为其他Sink

用命令行安装的话:

dotnet add package Serilog
dotnet add package Serilog.SourceGeneration
dotnet add package Serilog.Sinks.Console

2. 初始化Serilog配置

在应用启动入口(比如Program.cs)先完成Serilog的基础配置:

using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

try
{
    Log.Information("应用启动");
    // 编写你的应用业务逻辑
}
finally
{
    await Log.CloseAndFlushAsync();
}

3. 定义带Serilog.ILogger的分部日志方法

使用Serilog自带的[LoggerMessage]特性(注意是Serilog命名空间下的,不是Microsoft.Extensions.Logging的),分两种场景实现:

实例方法场景

如果是类的实例方法,无需在日志方法中显式传递ILogger参数,源生成器会自动复用类中注入的ILogger实例:

using Serilog;
using Serilog.Events;

public class CustomerService
{
    private readonly ILogger _logger;

    public CustomerService(ILogger logger)
    {
        _logger = logger;
    }

    [LoggerMessage(
        Level = LogEventLevel.Information,
        Message = "正在生成客户信息:{Customer}")]
    private partial void LogCustomerCreated(Customer customer);

    public void CreateCustomer(Customer customer)
    {
        // 直接调用日志方法即可
        LogCustomerCreated(customer);
        // 业务逻辑代码
    }
}

public class Customer
{
    public string Id { get; set; }
    public string Name { get; set; }

    public override string ToString() => $"[{Id}] {Name}";
}

静态方法场景

如果是静态日志方法,需要在参数中显式传入Serilog.ILogger:

using Serilog;
using Serilog.Events;

public static class CustomerLogger
{
    [LoggerMessage(
        Level = LogEventLevel.Information,
        Message = "正在生成客户信息:{Customer}")]
    public static partial void LogCustomerCreated(ILogger logger, Customer customer);
}

// 调用示例
CustomerLogger.LogCustomerCreated(Log.Logger, new Customer { Id = "1", Name = "张三" });

核心说明

Serilog的源生成器会在编译时自动生成高性能的日志实现代码,完全避免反射调用,性能表现和Microsoft的LoggerMessage机制一致,且是针对Serilog.ILogger做的专属优化。

内容的提问来源于stack exchange,提问作者ramu yepuganti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:00:59