SLF4J的使用
创建Maven项目导入依赖
<dependencies>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.30version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-simpleartifactId>
<version>1.7.32version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
configuration>
plugin>
plugins>
build>
入门案列:slf4j-simple
@Test
public void test01(){
/*
* 入门案例
* SLF4J对日志级别的划分
* trace,debug,info,warn,error五个级别
* tarce:日志的追踪信息
* debug:日志的详细信息
* info:日志的关键信息
* warn:日志的警告信息
* error:日志的错误信息
* 在没有任何其他日志实现框架基础的基础之上
* slf4j使用的是自带的框架slf4j-simple
* slf4j使用的就是自带的框架slf4j-simple
* slf4j-simple也可以单独以来的形式导入进来
* */
Logger logger = LoggerFactory.getLogger(SKF4JTest.class);
logger.trace("trace信息");
logger.debug("debug信息");
logger.info("info信息");
logger.warn("warn信息");
logger.error("error信息");
}
SLF4J动态打印异常信息
@Test
public void test02()
{
/*
* 我们输出动态的信息时
* 也可以使用占位符的形式来代替字符串的拼接
*
* 我们有时候输出的日志信息/,需要我们搭配动态的数据
* 有可能是信息,有可能是数据库中的数据
* 总之我们这样做的最大好处就是可以让日志答应更加灵活
* 若果是通过字符串拼接的形式,不只是麻烦,而且更重要的是可读性查
* 我们的日志打印是支持替代符的形式做日志的拼接的
* 一般情况下,几乎所有的日志实现产品,都会提供这种基础功能
*
* */
Logger logger = LoggerFactory.getLogger(SKF4JTest.class);
String name="zs";
int age=23;
logger.info("学生信息-姓名:"+name+"年龄:"+age);
logger.info("学生信息-姓名:{},年龄:{}",new Object[]{name,age});
logger.info("学生信息-姓名:{},年龄:{}",name,age);
}
打印异常信息
@Test
public void test03(){
/*
* 日志对异常信息的处理
* 一般情况下,我们在开发中的异常信息,那都是记录在控制台中的(我们在开发环境中的一种打印方式)
* 我们会根据异常信息提供有用的线索调式bug
* 但是在真实生产环境中(项目上线),对于服务器或者是系统相关的问题
* 在控制台上也会提供相应的异常或错误信息的输出
* 但是在这种错误输出方式(输出的时间,位置,格式。。。。。)都是服务器系统默认的
* 我们可以通过日志技术,选择将异常以日志的方式,进行输出查看
* 输出的时间,位置(控制台,文件),格式完全由我们自己定义
* */
// System.out.println(123);
Logger logger = LoggerFactory.getLogger(SKF4JTest.class);
try {
Class.forName("aaa");
} catch (ClassNotFoundException e) {
//打印栈追踪信息
// e.printStackTrace();
logger.info("xxx类中的xxx方法出现了异常,请及时关注信息");
//e是应用类型对象,不能根前面的{}做有效的字符串拼接
//logger.info("具体错误是:{}",e);
//我们不用加{},直接后面加上异常对象即可
logger.info("具体错误是:",e);
}
}
试着将SLF4J同时集成多个日志实现的结果分析
引入依赖
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.3version>
dependency>
使用:
@Test
public void test04(){
/*
* 集成其他日志之前
* 观察官网图
* SLF4J日志门面,共有3种对日志实现绑定
* 1.在没有绑定任何日志的基础上,日志是不能绑定实现任何功能的
* 值得大家注意的是,通过我们刚刚演示的案列slfj-simple是slf4j官网提供的
* 使用的时候也需要导入依赖,slf4j核心依赖是不提供任何实现的
* 2.logback和simple(包括nop)
* 都是slf4j门面时间线后面提供的日志实现,所以API完全遵循slf4j进行的设计
* 那么我们只需要导入想要使用的日志实现依赖,即可与SLF4J无缝衔接
* 值得一提的是nop虽然也划分到实现中了,但是他是指不时现日志记录(后续回提到)
* 3.log4j和JUL
* 都是slf4j的门面时间线前面的日志实现,所以API不遵循slf4j进行设计
* 通过适配桥接的技术完成与日志门面的衔接
*
* 将logback框架集成进来
*
* 测试1:
* 在原有的SLF4J=Simple日志实现的基础上,又集成了lombok
* 通过这次的测试,日志打印出来java.lang.ClassNotFoundException: aaa
* 通过这一句发现SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
* 虽然集成了lombok,但是我们现在使用的仍然是slf4j-simple
* 事实上只要出现了这个提示SLF4J: Class path contains multiple SLF4J bindings.
* 在SLF4J环境下证明同时出现了多个日志实现
* 如果pom.xml文件上第一个是logback则使用先导入的依赖
*
* */
Logger logger = LoggerFactory.getLogger(SKF4JTest.class);
try {
Class.forName("aaa");
} catch (ClassNotFoundException e) {
logger.info("具体错误是:",e);
}
}
Slf4j集成logback
测试:
* 将slf4j-simple注释掉
* 只留下logback那么slf4j门面使用的就是logback日志实现
* 值得一提的是,这一次没有多余的提示
* 所以在真实开发情况下用一种日志的集成就可以实现了
*
* 通过这歌集成测试,我们会发现虽然底层的日志变了,但是源代码完全没有变
* 这就是日志门面给我们带来最大的好处
* 在底层真实记录日志的时候,不需要应用去做任何的了解
* 应用只需要去记slf4j的API就可以了