规范
基本参考阿里规约,有部分不一样的地方下面会另做说明
https://mrkaorou.github.io/2018/07/25/阿里巴巴Java开发手册-终极版/阿里巴巴Java开发手册-终极版.pdf
@Slf4j 日志输出规范
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
import lombok.ToString;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects;
/**
* 日志输出规范
*/
@Slf4j
public class LogTest {
@SneakyThrows
public static void main(String[] args) {
// *************************************************************************************************************
// ************************************************* 日志打印原则 ************************************************
// + 默认已经打印了方法执行路径的参数,不需要为方法入参再加日志打印
// + if判断前面一定要打印日志,方便通过日志分析进入了哪个代码分支
// + 集合操作前要打印集合元素数量
// + 重要业务代码执行过程一定要添加日志
// *************************************************************************************************************
if (log.isDebugEnabled()) { // 添加日志级别判断, 用于控制日志输出粒度
log.debug("DEBUG 级别日志输出");
log.debug("DEBUG 级别日志输出,带参数占位符。字符串:{},数字:{},对象(默认执行toString方法):{}", "参数1", 2, new Item().setKey("name").setValue("Conor Xie"));
}
if (log.isInfoEnabled()) { // 添加日志级别判断, 用于控制日志输出粒度
log.info("INFO 级别日志输出");
log.info("INFO 级别日志输出,带参数占位符。字符串:{},数字:{},对象(默认执行toString方法):{}", "参数1", 2, new Item().setKey("name").setValue("Conor Xie"));
}
String key = "a";
log.info("key={}", key); // if判断前面一定要打印日志,方便通过日志分析进入了哪个代码分支
if (Objects.equals(key, "A")) {
} else if (Objects.equals(key, "B")) {
} else {
}
try {
Integer.parseInt("abc");
} catch (Exception e) {
// e.printStackTrace(); 禁止使用这种方式输出日志,这种日志不会记录到日志文件,而且会导致内存泄露
log.error(e.getMessage(), e); // 使用 log.error 第一个参数必须是字符串,最后一个参数必须把 Exception 对象传进去,日志文件才能记录堆栈信息
// 带占位符的异常日志,最后一个参数也一定是 Exception 且不需要加占位符
log.error("ERROR 级别日志输出,带参数占位符。字符串:{},数字:{},对象(默认执行toString方法):{}", "参数1", 2, new Item().setKey("name").setValue("Conor Xie"), e);
}
}
@Getter
@Setter
@ToString(callSuper = true)
@Accessors(chain = true)
public static class Item {
private String key;
private String value;
}
}