本文共 4062 字,大约阅读时间需要 13 分钟。
本人是个新手,写下博客用于自我复习、自我总结。 如有错误之处,请各位大佬指出。 学习资料来源于:尚硅谷
在开发一个大型系统时,判断部分代码写的是否正确,可能会选择System.out.println(" “); 来将关键数据打印在控制台上。但在最后系统完成时,可能不需要输出,也就是说需要把之前的System.out.println(” ")全部删掉,或者需要把这些写在一个独立的文件中,以便管理和监控系统在运行时的一些信息,这时就会出现麻烦的情况。即:把之前所有的输出删去,或者把之前所有的输出移动到一个文件中。所以,应该在开发系统时,考虑使用日志框架来记录数据,避免在系统完成时带来的一系列麻烦。同样的,使用日志框架也可以为我们带来更多的功能。可以写一个统一的接口层:日志门面(日志的一个抽象层),再给项目中导入具体的日志实现就行了。
市面上常用的日志框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j …介绍如下:
日志门面(日志的抽象层) | 日志实现 |
---|---|
JCL 、SLF4j、jboss-logging | Log4j、JUL 、Log4j2 、Logback |
即选一个门面(抽象层)和一个实现方式。
常用的为: 日志门面:SLF4j 日志实现:Logback而SpringBoot底层是Spring框架,Spring框架默认是用JCL;但SpringBoot选用SLF4j和logback;
以后开发的时候,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层里面的方法。
import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); }}
首先就应该给系统里面导入slf4j的jar 和 logback的实现jar。
(slf4j官网提供的使用图片) 深蓝色为实现层,墨绿色为适配层,适配那些不认识slf4j的日志实现。每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件。
比如 我使用slf4j+logback的实现方式,但是Spring框架使用JCL、Hibernate框架使用jboss-logging…
如果放在一起,那么该如何做到统一呢?slf4j官网提供了办法:
方法就是: 1、将系统中其他的日志框架先排除出去; 2、用中间包来替换原有的日志框架; 3、我们导入slf4j其他的实现。也就是说:SpringBoot的底层也是使用slf4j+logback的方式进行日志记录。同时,SpringBoot也允许把其他的日志替换成slf4j。如果,我们要引入其他框架,就一定要把这个框架的默认日志依赖移除掉。
就比如SpringBoot内部移除了Spring的默认日志依赖:org.springframework spring-core commons-logging commons-logging
当我们按照SpringBoot_01文章,自动建立了一个SpringBoot工程后,直接执行,就会发现,SpringBoot默认帮我们配置好了日志,当然也就可以手动调整:
我的Test文件:
package com.guigu.springboot;import org.junit.jupiter.api.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass SpringBoot03LoggingApplicationTests { //记录器(用这个来记录日志) Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() { //日志的级别: //由低到高 trace debug info warn error //可以调整需要输出的日志级别;日志就只会在这个级别及以后的高级别生效 logger.trace("这是trace日志..."); logger.debug("这是debug日志..."); //SpringBoot默认给我们使用的是info级别,即输出的是info级别及以上的 logger.info("这是info日志..."); logger.warn("这是warn日志..."); logger.error("这是error日志..."); }}
这其中就用到了记录器,以及一些用法。SpringBoot默认给我们使用的是info级别,即输出之后,只会看到info级别及以上的,当然也可以修改:
application.properties中:logging.level.com.guigu=trace
即:logging.level.包名=级别
这样就可以指定级别,在输出的时候就可以看到指定级别及以上的日志信息。application.properties中:
#当前项目下,生成指定名字的日志logging.file=springboot.log
之后就可以发现,在项目目录下,增加了一个springboot.log文件,记录了日志信息。当然也可以对它存放到指定位置:
#指定存放位置:logging.file=D:/springboot.log
一般情况下,使用logging.path。如果logging.path和logging.file同时使用,则logging.file起作用。
#在当前磁盘的根路径下,创建spring文件夹和里面的log文件夹。log文件夹中,使用spring.log作为默认文件logging.path=/spring/log
其他:
#在控制台输出的日志的格式logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n#指定文件中日志输出的格式logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
日志输出格式:
%d:表示日期时间 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %logger{50}:表示logger名字最长50个字符,否则按照句点分割 %msg:日志信息 %n:换行符在类路径下,放上每个日志框架自己的配置文件即可;SpringBoot就不使用它默认配置的了。
Logging System | Customization |
---|---|
Logback | logback-spring.xml,logback-spring.grooy,logback.xml,logback.groovy |
Log4j2 | log4j2-spring.xml,log4j2.xml |
JDK | logging.properties |
logback.xml:直接被日志框架识别;
logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,同时可以使用SpringBoot的高级Profile功能:
可以指定某段配置只在某个环境下生效
(即,只要经过了SpringBoot的解析,就可以使用SpringBoot特有的其他功能。所以显然logback.xml就不可以使用这种方法)
激活某个环境,就和SpringBoot_02文章中一样,在application.properties中,调用语句。在使用的时候,最好使用logback-spring.xml,log4j2-spring.xml 等,经过SpringBoot解析的文件格式,这样就可以实现更多高大上的功能。
每个日志文件的格式就不过多赘述,百度即可。
转载地址:http://cayki.baihongyu.com/