生产和测试环境中需要日志来记录、跟踪和分析系统的运行状态,但是有太多带有杂讯的日志又会影响跟踪,甚至可能对系统的运行带来影响。

日志级别

  • ERROR

    ERROR 是最高级别错误,反映系统发生了非常严重的故障,无法自动恢复到正常态工作,必须通知到开发者及时修复。系统需要将错误相关痕迹以及错误细节记录 ERROR 日志中,方便后续人工回溯解决。

  • WARNING

    WARNING 是低级别异常日志,反映系统在业务处理时触发了异常流程,但系统可恢复到正常态,下一次业务可以正常执行。但 WARN 级别问题需要开发人员给予足够关注,往往表示有参数校验问题或者程序逻辑缺陷,当功能逻辑走入异常逻辑时,应该考虑记录 WARN 日志。

  • INFO

    INFO 日志主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到 INFO 日志中,方便日常运维工作以及错误回溯时上下文场景复现。

  • DEBUG

    开发人员可以将各类详细信息记录到 DEBUG 里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等等。其他等级不方便显示的信息都可以通过 DEBUG 日志来记录。

日志打印要求

  • 调用外部系统 API 时必须打印日志,记录请求参数和返回参数
  • 避免重复打印日志,浪费磁盘空间
  • 正确使用日志级别,生产环境中禁止输出 debug 日志
  • 谨慎记录日志,日志埋点并非越多越好,日志打印过于频繁会产生性能问题
  • 避免打印无意义的日志,会对问题排查造成干扰。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?

需要规避的问题

频繁打印大数据量日志:

当日志产生的速度大于日志文件写磁盘的速度,会导致日志内容积压在内存中,导致内存泄漏。

无意义的Log:

日志不包含有意义的信息: 你肯定想知道的是哪个文件不存在吧

File file = new File("xxx");
if (!file.isExist()) {
  LOG.warn("File does not exist"); //Useless message  
}

混淆信息的Log:

日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?

Connection connection = ConnectionFactory.getConnection();
if (connection == null) {
  LOG.warn("System initialized unsuccessfully");
}
作者:Jeebiz  创建时间:2022-08-31 10:16
最后编辑:Jeebiz  更新时间:2024-11-14 21:58