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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:45:56