如何在编译时日志源生成代码中传入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
相关产品推荐
相关产品推荐

