日志分级
- ERROR:系统发生了错误事件,但仍然不影响系统的继续运行。系统需要将错误或异常细节记录ERROR日志中,方便后续人工回溯解决。
- WARN: 系统在业务处理时触发了异常流程(参数验证不过),但系统可恢复到正常态,下一次业务可以正常执行。如程序调用了一个旧版本的接口,可选参数不合法,非业务预期的状态但仍可继续处理等
- INFO: 记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现
- DEBUG: 可以将各类详细信息记录到DEBUG里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等。
日志优先级别标准顺序
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
如果日志级别设置 INFO,只有输出级别为 INFO、WARN,后面的日志才会正常输出。
日志格式
%date{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %contextName [%thread] %-5level %logger{36} - %msg%n
- %date{yyyy-MM-dd HH:mm:ss.SSS} 日志时间
- %X{requestId} 请求id
- %contextName项目名称
- %thread线程名称
- %-5level日志级别
- %logger{36}类名全路径
- %msg%n日志信息
例子
2021-05-19 16:53:39.140 [f217275ecc13452081db9396c3e7c4cf] shuyun-prize-admin [http-nio-8048-exec-3] INFO c.s.p.service.impl.TUserServiceImpl - loginUser.authOrgId:[3, 9, 10, 12, 15, 21, 25, 30, 31, 37, 38, 39, 40, 41, 42, 43, 44, 45, 413]
2021-05-19 16:53:39.140 [f217275ecc13452081db9396c3e7c4cf] shuyun-prize-admin [http-nio-8048-exec-3] INFO c.s.p.web.control.AuthController - 登陆用户所在大区业务部信息:3,9,10,12,15,21,25,30,31,37,38,39,40,41,42,43,44,45,413
2021-05-19 16:53:39.141 [f217275ecc13452081db9396c3e7c4cf] shuyun-prize-admin [http-nio-8048-exec-3] INFO c.s.p.web.control.AuthController - 登录成功,loginId=123
2021-05-19 16:53:39.642 [4775914915c8442fbc8a6321eb276f73] shuyun-prize-admin [http-nio-8048-exec-5] INFO c.s.p.service.impl.MenuServiceImpl - 从M获取菜单
日志使用规约
- 使用lombok的注解@Slf4j
@Slf4j
public class Test {
public void test() {
log.info("");
}
}
- 不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次日志,应抛出异常,顶层打印一次日志。
try {
} catch (Exception e) {
log.error("错误信息", e); //错误
throw e;
}
- 输出Exceptions的全部堆栈信息,但是不能使用e.printStackTrace()
//错误例子,直接使用
e.printStackTrace()
// 错误例子, 丢失掉StackTrace信息
log.error(e.getMessage());
// 错误例子,丢失掉StackTrace信息
log.error("Bad things : {}", e.getMessage());
// 正确例子
log.error("Bad things : {}",e);
- 禁止使用system.out用于日志记录
public void test() {
System.out.println("日志信息");//错误
}
- 禁止异常捕获中使用info日志级别,在查找日志时不便于查找
try {
} catch (Exception e) {
log.info("错误信息", e); //错误
}
- 日志输出必须使用占位符,如果使用字符串拼接,当日志不打印也会造成资源浪费
//错误
log.error("错误信息,id="+id);
//正确
log.error("错误信息,id= {}", id);
- 输出POJO类时必须重写toString方法,使用lombok注解@ToString
@Data
@ToString
public class User {
private String name;
private int age;
}
//log.info("用户信息{}",user);
- 禁止大量无效重复的日志输出
for (int i = 0; i < 1000; i++) {
log.info("日志信息");
}
- 不可以将敏感业务信息记录入日志文件
- 禁止没有业务信息的日志
public void getUser() {
log.info("开始查询用户");
//业务处理
log.info("查询用户结束");
}
基本格式
log.error()
log.error("[当前方法名]错误信息:{}",e);
//例子
log.error("[createMember]创建会员错误{}",e);
log.info()
log.info("业务信息,参数信息:[{}],参数信息:[{}]",参数1,参数2);
//例子
log.info("总部接口验证内码,内码:[{}],外码:[{}]", code1, code2);