30 January 2019

日志的作用(why)

  • 了解系统实时运行状态
  • 定位线上问题,诊断故障
  • 发现异常,以便事前修复、事后告警

日志的概念(what)

级别

  • ERROR 日志,反应业务关键流程出现了问题,发现了就必须去关注,直到不再打印为止。(假如系统在大半夜出错了,如果你认为需要通过日志告警来通知PE或者开发起床跟进,那么你就打ERROR日志,否则就打WARN)
  • WARN 日志,任何可能影响业务的事件,允许固定百分比的请求中出现,但能在一定时间内恢复,需要关注数量,数量突增的需要关注,直到恢复正常水平(打日志的同时,抄送哨兵监控项计数,设定阈值告警)
  • INFO 日志,记录输入输出、程序关键节点等必要信息,平时无需关注,但出问题时可根据INFO日志诊断出问题
  • DEBUG 日志,记录技术(网络、磁盘、CPU等)上的问题,与业务无关。开发人员一般不关注,更多的是帮助运维人员发现问题
  • TRACE 日志,线上基本不打,仅仅是线下帮助开发人员了解功能实现

分类

诊断日志
  • 自身服务请求入参和出参
  • 依赖服务入参和出参
  • 运行环境异常,如网络、磁盘、数据库、缓存等问题
  • 业务流程异常
  • 定时任务运行日志,如固定间隔扫描数据库,需打印扫描范围
  • 服务启动、初始化、关闭日志
审计日志
  • 一切管理后台操作,都需打印日志,包含当前操作用户、行为,重要日志数据库记录
  • 用户前台操作日志
统计日志
  • 访问统计、业务指标统计、程序耗时等

日志规范(how)

  • 明确日志打印级别,明确日志打印要包含什么信息
  • 提供方服务,建议以 INFO 级别记录入参,出参可选
  • 消费队列消息,务必打印消息内容
  • 调用依赖方服务,建议以 INFO 级别记录入参和出参
  • 运行环境问题,如网络错误、建议以 WARN 级别记录错误堆栈,并以打点的方式上报哨兵
  • 定时任务,务必打印任务开始时间、结束时间。涉及扫描数据的任务,务必打印扫描范围

    以下几条来自阿里巴巴java开发手册 日志规约 部分

    • 异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么> 通过关键字throws往上抛出。
    • 谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。
    • 可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别,error级别只记录系统逻辑出错、异常等重要的错误信息。如非必要,请不要在此场景打出error级别。
    • 对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式。
    • 应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

参考

1、when-to-use-the-different-log-levels

2、最佳日志实践

3、阿里巴巴Java开发手册