java log 管理 java loggerfactory_slf4j

Log4j背景介绍

Log4j是Apache的一个开源项目,使用Log4j,控制日志信息每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

Log4j的三大组件

Log4j的三个组件 : 日志记录器(Logger),输出端(Appenders),日志格式化(Layout)

  1. Logger : 控制启动/禁用哪些日志记录语句,也可以对日志信息进行级别限制
  2. Appenders : 指定日志将打印到控制台还是文件
  3. 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;
	}
}

具体如何实现方式

java log 管理 java loggerfactory_log4j_02


见识一下日志文件

java log 管理 java loggerfactory_log4j_03


再访问一次

java log 管理 java loggerfactory_java log 管理_04


但是Log4j的logger不止info这个级别

Log4j有五个级别

trackdebug

info

warn

error

用户级别 : error warn info 这三个级别属于生产环境,是运维人员需要看得懂的
开发级别 : debug

error

影响程序运行,当前请求正常运行的异常情况

  1. 打开配置文件失败
  2. 第三方网络连接异常
  3. sqlException等不应该出现的情况
  4. 某个serviceimpl的方法返回的list集合应该有元素却获取到一个空集合list
    字符转换的时候报错显示无GBK字符集

warn

不应该出现但是不影响程序,当前请求正常运行的异常情况,例如:

  1. 有容错机制的时候出现错误情况
  2. 找不到配置文件,但是系统能自动创建配置文件
  3. 即将接近临界值的时候,例如:
    缓存池占用达到警告线

info

  1. 系统运行信息
  2. serviceimpl方法的出入口
  3. 主要逻辑分步骤
  4. 外部接口部分
  5. 客户端请求参数和返回给客户端的结果
  6. 调用第三方的调用参数和调用结果

debug

  1. 用于记录程序变量
  2. 多次迭代中的变量
  3. 方法/运算结果
  4. 替代代码中的注释

trace

  1. 主要用于系统运行中的完整信息,完整的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对象

java log 管理 java loggerfactory_apache_05