mi-assessment/docs/开发规范/2-异常日志/2.1-日志规约.md
2026-02-03 20:50:51 +08:00

2.9 KiB
Raw Permalink Blame History

2.1 日志规约


【强制】

  1. 日志组件

    • 底层框架Aegis.Core.Logs 使用 NLog 作为日志记录提供程序。
    • 集中收集:生产环境必须配置 SeqELK 作为日志的集中收集与分析端点。
    • 抽象使用:代码中应依赖 Microsoft.Extensions.Logging.ILogger<T> 接口进行日志记录,避免直接依赖 NLog 的特定 API。
  2. API 请求日志

    • 自动化记录Web API 项目可以通过 AOP 过滤器(如 [TypeFilter(typeof(LogAttribute))] 或全局过滤器)自动记录 HTTP 请求的入参、出参、执行时间及客户端信息。
    • 避免冗余禁止在 Controller 方法内部手动记录 "进入方法"、"离开方法" 等流水账日志,除非有特殊的业务追踪需求。
  3. 异常记录规范

    • 完整堆栈:记录异常时,必须Exception 对象作为 LogError 方法的第一个参数传入。
    • 反例_logger.LogError($"处理失败:{ex.Message}"); (丢失堆栈信息)
    • 正例_logger.LogError(ex, "处理订单 {OrderId} 失败", orderId);
  4. 结构化日志

    • 使用模板:必须使用消息模板Message Templates语法使用 {Property} 占位符),禁止使用字符串拼接或 string.Format。这确保日志在 Seq 中可被索引和查询。
    • 正例_logger.LogInformation("用户 {UserId} 修改了状态为 {Status}", userId, status);
  5. 默认上下文信息

    • 自动注入:框架层(Aegis.Core.Logs)已统一配置日志 Layout自动包含 RequestId (${request-id}) 和 调用方法名 (${callsite})。
    • 无需手动记录:开发者在记录日志时,无需在消息体中重复记录当前方法名或 RequestId。
    • 说明:默认 Layout 格式为 ${date}|${level:uppercase=true}|${request-id}|${callsite:includeNamespace=false}|${message}|${exception}

【推荐】

  1. 日志级别定义

    • Trace/Debug:仅用于开发环境调试,生产环境默认关闭。
    • Information:记录系统关键流程节点(如:定时任务开始/结束、关键状态流转)。
    • Warning:记录非预期的但系统可自动恢复的业务异常(如:参数校验失败、第三方接口偶尔超时)。
    • Error:记录导致当前请求失败的系统异常(如:数据库连接失败、空指针异常)。
    • Critical:记录导致系统崩溃或无法提供服务的致命错误。
  2. 日志保留策略

    • 本地文件日志建议按天滚动(RollingFile),保留 7-15 天。
    • Seq 服务器日志根据磁盘容量配置保留策略(通常 30 天)。
  3. 敏感信息脱敏

    • 严禁在日志中明文记录密码、密钥、身份证号、银行卡号等敏感信息。