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
相关产品推荐
相关产品推荐

