Log4j是Apache的一个开源项目,使用Log4j,控制日志信息每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j的三个组件 : 日志记录器(Logger),输出端(Appenders),日志格式化(Layout)
Logger : 控制启动/禁用哪些日志记录语句,也可以对日志信息进行级别限制Appenders : 指定日志将打印到控制台还是文件Layout : 控制日志信息的显示格式Log4j使用logger的三个步骤如下 : 1.引入logger类和logger工厂类 2.声明logger 3.记录日志
//步骤1: 引入slf4j接口的logger和LoggerFactory import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DemoService{ //步骤2: 声明一个Logger实现类,以static的方式 //Logger对象是否声明为静止业界有一些争议 //1. static的优势在于 static Logger 更符合语义,节省CPU,但是不支持注入 //2. 不使用static的优势在于 支持注入,对于JVM中运行的多个引用同一个类库应用程序,可以在不同的程序对同个类Logger进行不同的配置 private final static Logger logger=LoggerFactory.getLogger(DemoService.class); public boolean verfiyDemoInfo(String userName,String password){ //步骤3:log it 输出log信息 logger.info("试试看输出什么信息 [{}]”,userName); return false; } }见识一下日志文件 再访问一次 但是Log4j的logger不止info这个级别 Log4j有五个级别 track debug info warn error
用户级别 : error warn info 这三个级别属于生产环境,是运维人员需要看得懂的 开发级别 : debug
影响程序运行,当前请求正常运行的异常情况
打开配置文件失败第三方网络连接异常sqlException等不应该出现的情况某个serviceimpl的方法返回的list集合应该有元素却获取到一个空集合list 字符转换的时候报错显示无GBK字符集不应该出现但是不影响程序,当前请求正常运行的异常情况,例如:
有容错机制的时候出现错误情况找不到配置文件,但是系统能自动创建配置文件即将接近临界值的时候,例如: 缓存池占用达到警告线在实际开发中我们经常用到的是info和debug 我具体描述一下info级别的用法
void info(java.lang.String s); 输出 [main] INFO c.j.training.logging.service.UserService - 开始初始化配置文件读取模块 void info(java.lang.String s, java.lang.Object o); 输出 [main] INFO c.j.training.logging.service.UserService - 开始导入配置文件[/somePath/config.properties] void info(java.lang.String s, java.lang.Object o, java.lang.Object o1); 输出 [main] INFO c.j.training.logging.service.UserService - 开始从配置文件[/somePath/config.properties]中读取配置项[maxSize]的值 void info(java.lang.String s, java.lang.Object... objects); 输出 [main] INFO c.j.training.logging.service.UserService - 在配置文件[/somePath/config.properties]中读取到配置项[maxSize]的值为[5]v
oid info(java.lang.String s, java.lang.Throwable throwable); 输出 [main] INFO c.j.training.logging.service.UserService - 读取配置文件时出现异常 java.io.FileNotFoundException: File not exists at cn.justfly.training.logging.service.UserServiceTest.testLogResult(UserServiceTest.java:31) ~[test-classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_45] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_45] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_45] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_45]输出时可以得到总结,logger信息的{}会被后面的参数按照顺序替换,带来的好处是运行时不需要打印盖log,不会产生重复的String对象