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

Serilog加载未引用但存在的Sink DLL失败问题求助

问题分析与解决思路

核心原因:Serilog的自动插件扫描机制

Serilog通过ReadFrom.Configuration加载配置时,会默认扫描当前程序运行目录下所有命名符合Serilog.Sinks.*、Serilog.Enrichers.*规则的程序集——不管你的配置里有没有用到这些插件,它都会尝试加载它们来探测可用的sink或增强器。

你的共享发布目录里有Serilog.Sinks.Console.dll(因为有一个项目引用了它),所以Serilog会自动尝试加载这个程序集。但你的File Sink项目并没有直接引用该DLL,.NET运行时无法正确解析它的依赖关系(比如缺少绑定重定向、或者关联的依赖组件未被正确部署),于是就抛出了FileNotFoundException。

可行的解决办法

1. 明确指定要加载的Serilog程序集

在配置里显式声明只加载你需要的sink程序集,关闭自动扫描:

  • 代码方式:初始化Logger时用Using方法指定仅加载File Sink:
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(config)
    .Using<Serilog.Sinks.File.FileSink>()
    .CreateLogger();
  • 配置文件方式:在appsettings.json的Serilog节点里添加Using数组,明确列出要加载的程序集:
{
  "Serilog": {
    "Using": ["Serilog.Sinks.File"],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {"path": "logs/app-.txt"}
      }
    ]
  }
}

2. 调整发布目录结构

既然是集中式包管理,你可以二选一:

  • 给所有共享发布的项目统一添加Serilog.Sinks.Console的引用(哪怕用不到),让.NET能正确识别并加载这个程序集;
  • 修改发布配置,把仅单个项目用到的Serilog.Sinks.Console.dll单独放到该项目的专属目录,别让其他项目的运行目录包含它。

3. 检查配置文件残留

先确认你的File Sink项目配置文件里没有任何Console Sink相关的配置节点,比如"WriteTo": [{"Name": "Console"}]——哪怕是被注释掉的节点,也可以排查一下是否会被Serilog意外解析。

补充说明

这种问题在共享依赖目录的场景下很典型,Serilog的自动扫描是为了方便动态扩展插件,但在依赖隔离要求高的场景下就会出问题。通过明确指定加载的程序集,就能避免无意义的扫描和加载错误。

内容的提问来源于stack exchange,提问作者yan.kun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:42:35