将NLog.config移动到项目子文件夹后NLog无法工作的原因咨询
NLog移动到配置子文件夹后无法运行的原因说明
这个问题属于NLog使用中的高频常见问题,大量做项目目录结构优化的开发者都遇到过同类现象,核心原因和NLog本身的默认加载逻辑直接相关:
- 默认自动扫描路径不包含自定义子目录
NLog的自动配置加载逻辑默认只会检索几个固定路径下的配置文件,不会主动递归遍历所有子文件夹查找配置,默认检索范围仅包括:- 应用程序运行根目录下的
NLog.config文件 - .NET Framework场景下,项目根目录的
Web.config/App.config中嵌入的NLog配置节点 - .NET Core/.NET 5+场景下,编译输出到程序根目录的
NLog.config文件
你把文件移动到自建的配置子文件夹后,不在NLog的默认扫描范围内,自然无法触发自动加载。
- 应用程序运行根目录下的
- 文件输出属性未同步修改
很多开发者移动文件后,没有同步修改IDE中NLog.config的文件属性,要么设置成了「不复制」,要么输出路径仍然指向程序根目录,最终运行时对应子文件夹下根本不存在配置文件,就算手动指定路径也会加载失败。 - 失效后无显性报错的特性放大了排查难度
NLog本身是日志组件,如果在初始化阶段找不到合法配置,会直接fallback到空配置状态,不会抛出显性异常,也不会输出错误日志(毕竟日志组件自身还没完成初始化),表现出来就是日志完全不输出、组件像没运行一样,很容易误导开发者以为是内部功能异常。
如果需要保留自定义配置文件夹的结构,不需要改回根目录存放,只要在程序入口(比如ASP.NET Core的Program.cs、桌面应用的Main方法),在第一次使用Logger之前手动指定配置文件路径即可,示例代码:
LogManager.Setup().LoadConfigurationFromFile("./configs/NLog.config");
记得提前把NLog.config的文件属性设置为「如果较新则复制」,确保编译后配置文件会被输出到运行目录对应的子文件夹下。
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

