回顾:
日志框架
SpringBoot选用的是SLF4j(日志抽象)和Logback(日志实现)的组合.
SLF4j的使用
在开发的过程中, 日志记录方法的调用是直接调用其抽象层(接口)里面的方法, 然后自动调用实现类的方法实现.
给系统导入slf4j的jar包和logback的实现jar包, 代码示例如下:
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抽象层日志框架, 但是其配置文件还是得使用实现层的日志框架本身的配置文件.
遗留问题
项目中掺杂了其他框架的日志, 那么就需要统一日志框架(slf4j+logback).
统一日志
① 将系统中其他的日志框架排除出去(exclusion)
② 用中间包替换原有的日志框架(偷天换柱)
③ 导入slf4j包的其他实现
SpringBoot的日志关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
小结:
① SpringBoot底层也是使用slf4j+logback的方式进行日志记录
② SpringBoot也把其他的日志都替换成了slf4j
③ 中间替换包
@SuppressWarnings("rawtypes")
public abstract class LogFactory {
static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
static LogFactory logFactory = new SLF4JLogFactory(); //偷梁换柱, 用的是slf4j的实现
④ 引入其他框架时, 需要将该框架的默认日志依赖移除掉
如: SpringBoot已经移除掉了Spring的默认日志依赖commons-logging
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
SpringBoot能自动适配所有的日志, 而且底层使用slf4j+logback的方式记录日志, 引入其他框架的时候, 只需要把这个框架依赖的日志框架排除掉即可.
日志配置
默认配置:
@Test public void contextLoads() { /** * 日志的级别 * 由低到高 trace < debug < info < warn < error * 可以调整需要输出的日志级别: 日志就只会在这个级别及以后的高级别输出日志信息 * SpringBoot默认使用的是info级别的日志输出 * 没有指定级别的就用SpringBoot默认规定的级别(root级别) */ logger.trace("这是trace日志..."); logger.debug("这是debug日志..."); logger.info("这是info日志..."); //自定义日志信息 logger.warn("这是warn日志..."); logger.error("这是error日志..."); }
① 配置文件中配置: logging.level.com.idea.springboot=trace
启动测试:
② 配置文件中配置: logging.file=SpringBoot.log 或 logging.file=d:/SpringBoot.log(指定生成路径)
启动测试:
③ 配置文件中配置: logging.path=/spring/log #在不配置logging.file的情况下配置logging.path指定生成日志的路径(/spring/log代表根路径下的spring目录下的log目录, 日志的默认名称为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.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功能
此时的高级功能为能自己配置开发环境或非开发环境, 在logback-spring.xml文件中, 如下图配置:
此时在SpringBoot的主配置文件中激活开发环境: spring.profiles.active=dev, 就能区分开发环境的日志信息输出和非开发环境的日志信息输出.