.NET 6项目基于Serilog实现供应商分目录日志及DLL日志集成方案问询
.NET 6中Serilog按供应商分目录日志及DLL日志集成方案
核心思路
通过Serilog的**日志上下文(LogContext)**动态注入供应商标识,结合文件输出接收器的路径占位符实现分目录存储;同时让DLL依赖.NET标准日志抽象层,复用API项目的Serilog配置实现日志统一输出。
具体实现步骤
1. 安装必要NuGet包
在API项目中安装以下包:
Install-Package Serilog.AspNetCore Install-Package Serilog.Sinks.File Install-Package Serilog.Enrichers.Context
DLL项目仅需安装抽象层包:
Install-Package Microsoft.Extensions.Logging.Abstractions
2. 配置Serilog支持动态路径
在Program.cs中配置Serilog,启用日志上下文读取,并通过占位符{Provider}指定动态日志路径:
var builder = WebApplication.CreateBuilder(args); // 配置Serilog builder.Host.UseSerilog((context, config) => { config .ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext() // 开启从LogContext读取自定义属性 .WriteTo.File( path: "logs/{Provider}/log00102.txt", rollingInterval: RollingInterval.Day, // 可选:按天滚动日志 outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" ); }); // 注册自定义中间件 builder.Services.AddTransient<ProviderLogContextMiddleware>(); var app = builder.Build(); // 启用日志上下文中间件(需放在其他业务中间件之前) app.UseMiddleware<ProviderLogContextMiddleware>(); // 其他中间件配置... app.Run();
3. 实现请求级供应商上下文注入
创建中间件,从请求中提取provider参数并注入到日志上下文:
public class ProviderLogContextMiddleware { private readonly RequestDelegate _next; public ProviderLogContextMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 从请求中获取provider值(示例从Query参数读取,可根据实际调整为Header/Body) var provider = context.Request.Query["provider"].FirstOrDefault() ?? "Unknown"; // 将供应商标识推入日志上下文,后续所有日志都会携带该属性 using (LogContext.PushProperty("Provider", provider)) { await _next(context); } } }
若从Body读取
provider,需先调用context.Request.EnableBuffering()允许重复读取请求体,避免影响后续Model绑定。
4. DLL日志集成实现
在DLL中通过依赖注入使用ILogger<T>,无需单独配置日志:
// DLL中的服务类 public class SupplierAService { private readonly ILogger<SupplierAService> _logger; // 构造函数注入ILogger public SupplierAService(ILogger<SupplierAService> logger) { _logger = logger; } public string ProcessRequest() { _logger.LogInformation("供应商A开始处理请求"); // 业务逻辑... _logger.LogInformation("供应商A请求处理完成"); return "供应商A响应结果"; } }
API项目调用DLL服务时,直接注入DLL类即可,日志会自动输出到对应供应商的日志目录。
关键注意事项
- 确保Web应用对
logs目录有写入权限,避免日志写入失败。 - 若未获取到
provider值,中间件会默认使用Unknown作为目录名,可根据需求调整默认值。 - 如需对不同供应商配置不同日志策略(如文件大小限制、保留天数),可通过
WriteTo.Conditional针对Provider属性做分支配置。
内容的提问来源于stack exchange,提问作者Hardik Dhuri
相关产品推荐
相关产品推荐

