web 系统日志最佳实践
结构化日志
结构化日志是在日志主体中嵌入 json 内容,便于日志的过滤和解析
log
2019-06-20T17:21:00.002899+00:00 app[email-wrkr.1]: DEBUG: Fetching mailing list {"listid":14777}
2019-06-20T17:22:00.000098+00:00 app[email-wrkr.1]: DEBUG: User opted out {"userid":3654}日志级别
INFO - 不表示任何故障或错误的信息性消息。 WARN - 表示存在潜在问题,但对用户体验没有影响。 ERROR - 表示一个严重的问题,可能会影响用户体验。 FATAL - 表示致命错误,用户体验受到重大影响。 DEBUG - 用于调试。该消息专门针对应用程序的开发人员。
内容
记录类型
- 应用程序错误
- 输入和输出验证失败
- 账户体系 (权限改变、密钥修改等)
- 其他高风险事件,如数据导入和导出
- 服务的关键节点,如服务条款
上下文
日志应该包括足够的上下文,用于定位问题或事件发生的具体场景,协助排查。
RequestID
一个常见的实践是为每次请求生成 RequestID,串起请求的上下文。
同时 RequestID 应该是一些有效元信息的编码。
比如在微服务场景下,可以将容器代号编码进 ID 中。
侵入和非侵入式日志
非侵入式日志是指在 AOP 中打印的日志,比如在 controller 中记录请求信息。
侵入式日志是指需要开发人员在业务逻辑中进行硬编码的日志,比如系统管理员删除某个用户的权限,需要对这条操作进行具体的记录。