记录应用系统的日志主要有三个原因:记录操作轨迹、监控系统 运行状况、回溯系统故障。

日志规范

为降低沟通和学习成本,应用中的扩展日志命名方式应该有统一的约定,通过命名能直观明了的地表名当前日志文件是什么功能。

推荐的日志文件的命名:appName_logType_logName.log

  • 其中 logType 为日志类型,推荐 分类有 stats、monitor、visit等
  • logName 为日志描述

代码 规约推荐日志文件 至少保存15天,可根据日志文件的重要程度、文件大小及磁盘 空间在自行延长 保存时间。

日志的级别

针对不同的场景,日志被分为五种不同的级别,按照重要程度由低到高排序:

  • DEBUG 级别日志记录对调试程序有帮助的信息。
  • INFO 级别日志用来记录程序的运行现场,虽然此处并未发生错误,但是对排查其他错误具有指导意义。
  • WARN 级别日志也可以用来记录程序运行线程,但是更偏向于表名此处有出现潜在的错误的可能。
  • ERROR 级别日志表明当前程序运行发生了错误,需要被关注。但是当前发生的错误,没有影响系统的继续运行。
  • FATAL 级别日志表名当前程序运行出现了严重的错误事件,并且将会导致应用程序中断。

打印日志的正确姿势

// 使用条件判断形式
if(logger.isDebugEnabled()){
    logger.debug("Processing trade with id: "+id+" and symbol :" + symbol);
}

// 使用占位符形式
logger.debug("Processing trade with id: {}  and symbol: {}",  id,  symbol);

WARN、ERROR 都是与错误有关的日志级别 ,ERROR 级别为ERROR级别只记录逻辑错误、异常或者 违反重要的 业务逻辑规则,其他错误都可以归为WARN 级别。

记录日志一定要思考三个问题:

  • 日志是否有人看
  • 看到这条日志能做什么
  • 能不能提升问题排查效率

日志框架

日志框架分为三大部分,包括 日志门面、日志适配器、日志库。

Java的任务日志出现乱码_打印日志

日志门面

只提供一套接口规范,自身不负责日志功能的实现,目的是让使用者不需要关注底层具体是那个日志库来负责打印日志及具体的使用细节。

目前用的最为广泛的日志门面有两种 slf4jcommonns-logging

日志库

日志库具体实现了日志的相关功能,主流的日志库有三个,分别是log4j、log-jdk、logback

log4j 和 logbak 出自同一个作者,logback 是log4j的升级版且本身实现了slf4j的接口 。

日志适配器

日志门面适配器:因为slf4j规范是后面提出来的,在此之前的日志库是没有实现slf4j的接口的,例如log4j;所以在工程里要使用slf4j+log4j 的模式,就额外需要一个适配器(slf4j-log4j12)来解决接口不兼容的问题。

日志库适配器:在一些老的工程里,一开始为了开发简单而直接只用了日志库API来完成日志的打印,随着时间的推移想将原来直接调用日志库的模式改为业界标准的门面模式(例如slf4j+logback 组合),但老工程代码里打印日志的地方太多,难以改动,所以需要一个适配器来完成从旧日志库的 API 到 slf4j 的路由,这样在不改变原有代码的情况下也能使用 slf4j 来统一管理日志,而且后续自由替换日志库也不成问题。