SpringBoot日志记录
1、基本市场上的日志类型
日志门面(日志的抽象层) | 日志实现 |
|
|
左边选择一个门面(抽象层),右边来选一个实现。
日志门面:SLF4j(Simple Logging Facade for java)
日志实现:logback ;
SpringBoot:中选择了SLF4j+logback
2、SLF4j的使用
1、如何使用SLF4j
以后开发的时候,日志的记录方法的调用。不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法。
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的调用方法
绿色的都是适配层、深蓝的都是需要导入的包。
每一个日志的实现框架都有自己的配置文件,而这些配置文件还是做成日志实现框架本身的配置文件2、遗留问题
多个框架有多种日志配置文件,需要替换掉之前的jar包。用新的替换包来代替原来的包。
如何让系统中所有的日志都统一到slf4j:
- 1将系统中其他日志框架先排除
- 2把替换的包放入框架中
- 3导入slf4j的其他实现
3、SpringBoot日志关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
可以看到spring-boot-starter-logging中有三个转换的选择
我们可以看到中间的转换包
public class SLF4JBridgeHandler extends Handler {
private static final String FQCN = Logger.class.getName();
private static final String UNKNOWN_LOGGER_NAME = "unknown.jul.logger";
private static final int TRACE_LEVEL_THRESHOLD;
private static final int DEBUG_LEVEL_THRESHOLD;
private static final int INFO_LEVEL_THRESHOLD;
private static final int WARN_LEVEL_THRESHOLD;
public static void install() {
LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
}
private static Logger getRootLogger() {
return LogManager.getLogManager().getLogger("");
}
- 4、所以当我们引入了其他框架,我们一定要把这个框架的默认日志依赖移除掉
4、默认的日志
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootAutoconfigApplicationTests {
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
/**
* 日志的级别就是按照这个顺序
* 可以手动调整输出的日志级别
*/
logger.trace("trace日志");
logger.debug("debug日志");
//sb中默认给我们使用info级别的日志,没有指定级别,就使用默认的root级别
logger.info("info日志");
logger.warn("warn日志");
logger.error("error日志");
}
}
我们可以在properties中修改日志的输出级别
logging.level.com.atlyb=trace
日志的输出格式:
%的表示日期时间,
%thread表示线程名,
%-5level:日志的级别
%logger(50)表示logger名字最长50个字符,否则按照句点分割
%msg 日志的内容
%n 换行
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger(50) - %msg%n
logging.level.com.atlyb=trace
#loggong.path
#不指定路径在当前项目下生成sb.log日志
#可以指定完整的路径
#logging.file=D:/loggsb.log
#在当前磁盘的根部路线创建spring文件夹和里边的log文件夹使用默认的spring.log作为输出文件
logging.path=/spring/log
#在控制台出书的日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger(50) - %msg%n
#在指定文件中日志的输出格式
logging.pattern.file=%d{yyyy-MM-dd} |||| [%thread] |||| %-5level |||| %logger(50) |||| %msg%n
我们也可以看看springboot的默认设置
<?xml version="1.0" encoding="UTF-8"?>
<!--
Default logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->
<included>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
</included>
public class LoggingSystemProperties {
public static final String PID_KEY = "PID";
public static final String EXCEPTION_CONVERSION_WORD = "LOG_EXCEPTION_CONVERSION_WORD";
public static final String LOG_FILE = "LOG_FILE";
public static final String LOG_PATH = "LOG_PATH";
public static final String CONSOLE_LOG_PATTERN = "CONSOLE_LOG_PATTERN";
public static final String FILE_LOG_PATTERN = "FILE_LOG_PATTERN";
public static final String FILE_MAX_HISTORY = "LOG_FILE_MAX_HISTORY";
public static final String FILE_MAX_SIZE = "LOG_FILE_MAX_SIZE";
public static final String LOG_LEVEL_PATTERN = "LOG_LEVEL_PATTERN";
public static final String LOG_DATEFORMAT_PATTERN = "LOG_DATEFORMAT_PATTERN";
private final Environment environment;
根据上一张所讲述的。这里我们看到了logging中的所有properties
自定义配置文件
同样很简单,我们自定义一个logback.xml,然后放在根文件。则会使用我们的配置文件
Logging System | Customization |
Logback | logback-spring.xml;logback-spring.groovy;logback.xml ;logback.groovy |
log4j2 | log4j2-spring.xml ;log4h.xml |
JDK | logging.properties |
logback.xml 这种系统就直接识别了
然而如果使用spring-boot的功能,推荐使用logback-spring.xml,这种方式,比如:
//我们可以通过
<SpringProfile name='dev'></SpringProfile >
<SpringProfile name='!dev'></SpringProfile >
/*这种方式来规定日志的输出环境*/