如何追踪ASP.NET Core应用appsettings.json配置项的运行时使用情况
ASP.NET Core 运行时配置项使用情况追踪方案
原生实现(无需额外云服务)
- 自定义配置装饰器
ASP.NET Core 所有配置读取操作(包括索引器取值、GetSection调用、Options模式绑定POCO对象)都会经过IConfiguration抽象,你可以实现一个装饰器包装默认的配置实例,在每次读取配置时记录被访问的键:
在public class TrackingConfiguration : IConfiguration { private readonly IConfiguration _innerConfig; private readonly ConcurrentHashSet<string> _accessedKeys = new(); public TrackingConfiguration(IConfiguration inner) { _innerConfig = inner; } public string this[string key] { get { _accessedKeys.Add(key); return _innerConfig[key]; } set => _innerConfig[key] = value; } public IConfigurationSection GetSection(string key) { _accessedKeys.Add(key); // 这里同样要给返回的IConfigurationSection做追踪包装,覆盖子节读取、Bind绑定的场景 return new TrackingConfigurationSection(_innerConfig.GetSection(key), _accessedKeys); } public IEnumerable<IConfigurationSection> GetChildren() => _innerConfig.GetChildren(); public IChangeToken GetReloadToken() => _innerConfig.GetReloadToken(); // 应用关闭时将_accessedKeys输出到日志/本地文件,和appsettings.json全量键做差集即为未使用配置 }Program.cs中用这个包装类替换默认注入的IConfiguration单例即可,注意要覆盖GetChildren、Bind相关的读取路径,避免遗漏Options绑定场景的配置访问记录。 - 临时开启配置系统追踪日志
测试环境下可以直接把Microsoft.Extensions.Configuration类别的日志级别调整为Trace,配置系统会自动输出所有被读取的配置键信息。跑全量业务流程后从日志里提取访问过的键即可,不需要写自定义代码,缺点是日志量极大,不适合生产环境长期开。
结合Azure服务的生产环境方案
- 接入Azure App Configuration托管配置
把原有appsettings.json里的配置全部迁移到Azure App Configuration,服务原生提供配置访问统计能力,可以直接在门户查看每个配置键的最后访问时间、访问频次,不需要额外埋点就能直接筛出长期未访问的闲置配置。迁移成本极低,只需要在配置构建流程里加AddAzureAppConfiguration()调用,原有配置读取、Options绑定的业务代码完全不需要修改。 - 结合Application Insights做埋点追踪
如果不想迁移配置到Azure App Configuration,可以在前面提到的自定义配置装饰器里加埋点逻辑:每次检测到配置键被访问时,通过TelemetryClient上报一条自定义事件到Application Insights,事件携带被访问的配置键名。
上线埋点后覆盖1-2个完整业务周期(要包含定时任务、后台作业、异常分支、各环境差异化场景),就可以通过日志查询导出所有被访问过的配置键,示例查询逻辑:
把查询结果和全量配置键做对比,就能筛选出从未被访问、或者超过数月没有访问记录的闲置配置。customEvents | where name == "ConfigKeyAccessed" | summarize LastAccessTime = max(timestamp), TotalAccessCount = count() by tostring(customDimensions.ConfigKey) | order by LastAccessTime asc
注意:追踪阶段一定要覆盖所有运行场景,不要只验证主流程就删除配置,避免误删冷门分支、特殊环境才会用到的配置。第一次清理建议先给疑似闲置的配置加废弃标记,观察至少一个完整发版周期无异常后再彻底删除。
内容的提问来源于stack exchange,提问作者whatsinaname
相关产品推荐
相关产品推荐

