Log4j背景介绍
Log4j是Apache的一个开源项目,使用Log4j,控制日志信息每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j的三大组件
Log4j的三个组件 : 日志记录器(Logger),输出端(Appenders),日志格式化(Layout)
- Logger : 控制启动/禁用哪些日志记录语句,也可以对日志信息进行级别限制
- Appenders : 指定日志将打印到控制台还是文件
- Layout : 控制日志信息的显示格式
Log4j使用logger的步骤
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
error
影响程序运行,当前请求正常运行的异常情况
- 打开配置文件失败
- 第三方网络连接异常
- sqlException等不应该出现的情况
- 某个serviceimpl的方法返回的list集合应该有元素却获取到一个空集合list
字符转换的时候报错显示无GBK字符集
warn
不应该出现但是不影响程序,当前请求正常运行的异常情况,例如:
- 有容错机制的时候出现错误情况
- 找不到配置文件,但是系统能自动创建配置文件
- 即将接近临界值的时候,例如:
缓存池占用达到警告线
info
- 系统运行信息
- serviceimpl方法的出入口
- 主要逻辑分步骤
- 外部接口部分
- 客户端请求参数和返回给客户端的结果
- 调用第三方的调用参数和调用结果
debug
- 用于记录程序变量
- 多次迭代中的变量
- 方法/运算结果
- 替代代码中的注释
trace
- 主要用于系统运行中的完整信息,完整的http request和http response
总结
在实际开发中我们经常用到的是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对象