更多信息:
本篇算是学习笔记
编辑器:IntelliJ IDEA 2020.1
目录
日志框架
作用:框架来记录系统的一些运行时信息。
种类
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j
日志的抽象层 | 日志实现 |
---|---|
|
Log4j JUL(java.util.logging) Log4j2 Logback |
左边选一个门面(抽象层)、右边来选一个实现;
Spring框架选用是用JCL;
SpringBoot选用 SLF4j和logback;
SLF4j的使用
方法:日志记录方法的调用,不应该来直接调用日志的实现类,而是应该调用日志抽象层里面的方法。而抽象层会调用实现层来实现。
导入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");
}
}
1
The SLF4J interfaces and their various adapters are extremely simple. Most developers familiar with the Java language should be able to read and fully understand the code in less than one hour. No knowledge of class loaders is necessary as SLF4J does not make use nor does it directly access any class loaders. As a consequence, SLF4J suffers from none of the class loader problems or memory leaks observed with Jakarta Commons Logging (JCL).
2
Given the simplicity of the SLF4J interfaces and its deployment model, developers of new logging frameworks should find it very easy to write SLF4J bindings.
每一个日志的实现框架都有自己的配置文件(互不相同)。使用slf4j以后,配置文件还是做成日志实现框架自己的配置文件;
其他日志框架转换为SLF4J
目的:为了解决一个项目中日志框架不统一导致的问题。
解决方法
1、将系统中其他日志框架先排除出去;
2、用对应的jar包来替换原有的其他的日志框架;
3、我们导入slf4j其他的实现框架
Spring Boot 日志关系
pom.xml 文件分析
- SpringBoot底层也是使用slf4j+logback的方式进行日志记录
- SpringBoot也把其他的日志都替换成了slf4j;
- 中间替换包log4j-to-slf4j、jul-to-slf4j
注意:如果我们要使用别的框架(不使用slf4j+logback的框架,使用log4j框架),必须将这些转换包移除,不然包名和类名一致会冲突。
Spring Boot就移除掉 Spring框架使用的commons-logging;
总结
SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架(log4j之类的日志框架)的时候,只需要把这个框架依赖的日志框架排除掉即可;
Spring Boot日志的默认配置
默认配置
application.properties中日志的权限默认是info
logging.level.com.atgugui=trace
logging.file.name=springboot.log
#指定控制台的编码
logging.charset.console=utf-8;
#日志输出格式:
#%d表示日期时间,
#%thread表示线程名,
#%-5level:级别从左显示5个字符宽度
#%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
#%msg:日志消息,
#%n是换行符
#指定控制台中输出的格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
#指定文件中输出的格式
logging.pattern.file=%%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
Example | Description | ||
---|---|---|---|
(none) | (none) | 只在控制台输出 | |
指定文件名 | (none) | my.log | 输出日志到my.log文件 |
(none) | 指定目录 | /var/log | 输出到指定目录的 spring.log 文件中 |
logging file的优先级比logging path高
SpringBoot03LoggingApplicationTests
package com.atgugui.springboot03logging;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot03LoggingApplicationTests {
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//System.out.println();
/**
* 日志的级别;
* 由低到高 trace<debug<info<warn<error
* 日志只会输出你的级别 及 以上的信息。如果你是info,日志输出info、warn、error的信息
*/
//轨迹信息
logger.trace("这是trace日志...");
//调试信息
logger.debug("这是debug日志...");
/*SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别
可以在application.properties文件中调整级别*/
logger.info("这是info日志...");
//警告信息
logger.warn("这是warn日志...");
//错误信息
logger.error("这是error日志...");
}
}
默认配置的原理
org\springframework\boot\spring-boot\2.4.0
spring-boot-2.4.0.jar!\org\springframework\boot\logging\logback\base.xml
org\springframework\boot\spring-boot\2.4.0
spring-boot-2.4.0.jar!\org\springframework\boot\logging\logback\default.xml
LogbackLoggingSystemProperties
赋值之后,defaults.xml就可以从类似于CONSOLE_LOG_PATTERN获得相应的值。
写日志的配置文件
给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了
Logging System | Customization |
---|---|
Logback |
logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy
|
Log4j2 |
log4j2-spring.xml or log4j2.xml
|
JDK (Java Util Logging) | logging.properties |
logback.xml:直接就被日志框架识别了;
logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能
<layout class="ch.qos.logback.classic.PatternLayout">
<!--开发环境下使用-->
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<!--非开发环境下使用-->
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
环境的激活可以在application.properties中配置(根据你的情况选择激活的环境)
spring.profiles.active=dev
也可以在命令行上配置在Program arguments框中输入(根据你的情况选择激活的环境)
–spring.profiles.active=dev