参考文档:
Java日志使用小结
如果规范的有条理的打印日志,是程序员的基本素养之一。可以说:日志打得好,至少能提高20%的问题排查效率,所以如何优雅的进行日志输出是非常有必要的。
创新日志对象
定义logger
变量为static,确保一个对象只使用一个Logger
对象,避免每次都重新创建。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService{
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
}
日志文件规范
- 命名方式: 一般为
projectName_logName_logType.log
,比如demoproject_kafka_error.log
- 保存时间: 一般日志保留位30天左右,如果是重要日志需要视情况而定。
- 日志级别: 开发阶段一般使用为
debug
和info
,线上环境考虑到性能问题,可以设置为warn
或error
级别
日志打印规范
- 提前判断日志级别,使用占位符,防止字符串拼接和不必要代码的执行,如:
//条件判断
if(logger.isDebugEnabled){
//使用占位符
logger.debug("server info , id : {}, user : {}",id,user);
}
- 保证日志记录信息完整:日志记录的内容要包含异常的堆栈,如:
logger.error("rabbitmq consumer error,cause : {}" e.getMessage(),e);
另外,输出对象实例的时候,须确保对象重写了
toString
方法,否则只会输出其hashCode
值
- 正确使用日志级别,反例:
try{
// ...
}catch(xx){
logger.info(..);
}
这样,会导致error
级别的日志打印到info
日志文件中,导致错误日志中不刷新日志,影响问题排查效率。
- 推荐使用slf4j+logback组合
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${lastUpdateVersion}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${lastUpdateVersion}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${lastUpdateVersion}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${lastUpdateVersion}</version>
</dependency>
- ELK日志打印时,符号的使用提高工作效率
需要在真正的参数打印之前加分隔符,如. 或 : 或 ;
,方便在ELK中进行匹配查询,如:
logger.info("UserService_selectOne.param: [UserInfo = {}]", userInfo);
同时,使用[]
来包围参数可以更方便的查看日志中的参数内容。