agilelabs-fx-docs main topics/logging-and-diagnostics.md

日志与诊断

本页聚合日志策略、诊断入口、运行期定位与问题排查入口。

适用场景

  • 生产环境问题排查。
  • 请求链路、错误定位、WorkContext 与 Activity 追踪。
  • 诊断端点和后台管理入口保护。

必须遵守

  • 诊断页与后台入口必须受认证或网络边界保护。
  • 错误响应与日志职责分离:客户端拿规范化错误,详细信息进日志。
  • 非 HTTP 执行流也要建立可追踪的上下文。

推荐做法

  • 在 WebAPI 场景中统一异常处理与日志输出。
  • 利用 WorkContext、Activity、请求会话信息对齐 TraceId。
  • 发布前检查 /fwdev/req_stat/jobs 暴露范围。

版本查看

框架里和“版本”相关的诊断入口至少有两类,它们解决的不是同一个问题:

  • /fwdev/ASSEMBLY_VERSIONS:查看当前节点实际加载的程序集版本,适合确认 DLL 是否已经按预期替换。
  • /fwdiag/v:查看当前发布版本号,适合确认这台节点现在跑的是哪一次构建。

/fwdiag/v 这条链路依赖 MapDiagnosticRequest() 注册的诊断入口,以及运行目录下的 version.txt 文件。VersionTools 会从 AppContext.BaseDirectory/version.txt 读取版本号并返回给调用方。

这类版本查看最适合 Docker 发布的 ASP.NET WebAPI / Web 宿主项目:CI/CD 先在 dotnet publish 产物目录写入 version.txt,再由 Dockerfile 随最终发布目录一起复制进镜像,容器启动后 /fwdiag/v 就能直接返回当前镜像内的发布版本号。其他不走 Docker 的宿主只要也把 version.txt 放进运行目录,同样可以复用这条链路。

使用前要确认:

  • 应用已经注册 MapDiagnosticRequest()
  • 运行目录中确实存在 version.txt
  • 如果没有写入该文件,/fwdiag/v 可能返回空字符串或无内容。

常见坑

  • 在错误响应里直接暴露完整堆栈。
  • 后台任务没有建立上下文,导致日志链路断裂。
  • 诊断端点默认裸露到公网。
  • /fwdev/ASSEMBLY_VERSIONS/fwdiag/v 当成同一种版本信息,结果排查时看错对象。
  • 镜像 tag 已经带版本号,但运行目录里没有 version.txt,导致容器内无法通过 /fwdiag/v 查看当前发布版本。

真实用例

  • niusys-webapi:异常过滤器、/jobs 鉴权、Swagger 对齐。
  • woscm:项目级异常处理器、TraceId 回写、公共管道中间件。

相关页面