1.讨论
是否遇到过下面的情况,排查问题时,发现那块出现错误的地方有日志输出,但是输出的日志对于排查问题一点用都没有,好的日志大家感觉都具备哪些东西?
2.日志通用规范
1、**【强制】**在日志输出时,字符串变量之间的拼接使用占位符的方式。
说明:因为 String 字符串的拼接会使用 StringBuilder 的 append() 方式,有一定的性能损耗。使用占位符仅是替换动
作,可以有效提升性能。
2、**【强制】**生产环境禁止使用 System.out 或 System.err 输出或使用 e.printStackTrace() 打印异常堆栈。
说明:标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小
超过操作系统大小限制。
3、**【强制】**日志打印时禁止直接用 JSON 工具将对象转换成 String。
说明:如果对象里某些 get 方法被覆写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。
正例:打印日志时仅打印出业务相关属性值或者调用其对象的 toString() 方法。
4、**【强制】**正常参数日志使用info级别,不可使用error,warn等,以免混淆正常查询操作。
5、**【强制】**Log的内容一定要确保不会因为Log语句的问题而抛出异常造成中断。
说明:log.info(“list size:{}”,list.size());可能因为list为null,抛出异常。
6、**【强制】**坚决杜绝日志输出的copy行为,防止日志张冠李戴。
7、**【强制】**避免重复的打印同一日志,杜绝在循环体中输出日志。
3.常用日志级别使用场景
info | 打印业务关键信息可以用info,例如打印接口入参值、返回值、定时任务的开始执行与结束执行、Service方法中对于系统/业务状态的变更 | 用于观察信息流转, |
warn | 非重大错误可用warn,有容错机制的时候出现的错误情况 | 可修复,系统可继续运行下去; |
error | 非业务的重大错误,如接口调用失败、调用超时打印error级别日志、所有第三方对接的异常(包括第三方返回错误码)所有影响功能使用的异常,包括:SQLException 、空指针异常以及业务异常之外的所有异常 | 可修复,但无法确定系统会正常的工作下去;1. |
4.日志关键字
public enum UlpLoggingSignEnum {
/** controller层*/
CONTROLLER(1,"controller-logging "),
/** service层*/
SERVICE(2,"service-logging "),
/** dao层*/
DAO(3,"dao-logging "),
/** redis缓存层*/
REDIS(4,"redis-logging "),
/** rpc层*/
RPC(5,"rpc-logging "),
/** http请求层*/
HTTP(6,"http-logging "),
/** MQ相关*/
MQ(7,"mq-logging "),
/** elasticsearch相关 */
ES(8,"elasticsearch-logging "),
/** 定时任务相关 */
TIMEDTASK(9,"timed-task-logging "),
/** 定时检查相关 */
TIMECHECK(10,"timed-check-logging ");
UlpLoggingSignEnum(int code, String description){
this.code = code;
this.description = description;
}
private int code;
private String description;
}
4.1 controller层
logger.info(