经过不断的项目实践,不断总结,一个好的开发人员,应该有个好的开发习惯,日志是开发过程中不可缺少的一项,有了日志可以节省很多我们不必要的麻烦,也可以使我们迅速的定位问题。
- 引入loggerg类和logger工厂类
- 声明logger
- 记录日志
//1. 引入slf4j接口的Logger和LoggerFactory
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
//2. 声明一个Logger,这个是static的方式,我比较习惯这么写。
private final static Logger logger = LoggerFactory.getLogger(UserService.class);
public boolean verifyLoginInfo(String userName, String password) {
//3. log it,输出的log信息将会是:"Start to verify User [Justfly]
logger.info("Start to verify User [{}]", userName);
return false;
}
}
学习链接:
http://slf4j.org/faq.html#declared_static
- 静态Logger对象相对来说更符合语义,节省CPU,节省内存,不支持注入
- 对象变量Logger支持注入,对于一个JVM中运行的多个引用了同一个类库的应用程序,可以在不同的应用程序中对同个类的Logger进行不同的配置。比如Tomcat上部署了俩个应用,他们都引用了同一个lib
- public boolean isTraceEnabled();
- public boolean isDebugEnabled();
- public boolean isInfoEnabled();
- public boolean isWarnEnabled();
- public boolean isErrorEnabled();
2 logger.debug("["+resultCount+"]/["+totalCount+"] of users are returned");
3 }
3. Log什么
3.1 如何使用不同级别的Log
3.1.1 用户级别
3.1.1.1 Error
- 影响到程序正常运行、当前请求正常运行的异常情况,例如:
- 打开配置文件失败
- 第三方应用网络连接异常
- SQLException
- 不应该出现的情况,例如:
- 某个Service方法返回的List里面应该有元素的时候缺获得一个空List
- 做字符转换的时候居然报错说没有GBK字符集
3.1.1.2 Warn
- 不应该出现但是不影响程序、当前请求正常运行的异常情况,例如:
- 有容错机制的时候出现的错误情况
- 找不到配置文件,但是系统能自动创建配置文件
- 即将接近临界值的时候,例如:
- 缓存池占用达到警告线
3.1.1.3 Info
- 系统运行信息
- Service方法的出入口
- 主要逻辑中的分步骤
- 外部接口部分
- 客户端请求参数和返回给客户端的结果
- 调用第三方时的调用参数和调用结果
} catch (Exception ex){
String errorMessage=String.format("Error while reading information of user [%s]",userName);
logger.error(errorMessage,ex);
throw new UserServiceException(errorMessage,ex);
}
最后为了避免日志过于繁琐,开发者应该注意在项目中日志的打印,简单一句话,记录有利于定位问题的日志,做到不多打,也不少打同时根据需求调节日志的级别,一般建议到info级别。