SpringBoot的默认使用
观察SpringBoot的Maven依赖图
可以看出来,SpringBoot默认使用的日志系统是使用Slf4j作为门户,logback作为日志实现
编写一个测试代码看是否是这样
@SpringBootTest
class SpringbootLogDemoApplicationTests {
//使用Slf4j来创建LOGGER对象
public static final Logger LOGGER = LoggerFactory.getLogger(SpringbootLogDemoApplicationTests.class);
@Test
public void test01() throws Exception {
LOGGER.error("error");
LOGGER.warn("wring");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
//使用Log4j来获取Logger对象
org.apache.logging.log4j.Logger logger = LogManager.getLogger(SpringbootLogDemoApplicationTests.class);
logger.info("log4j info");
}
}
运行结果如下
2023-10-22 17:21:16.307 ERROR 8912 --- [ main] com.zmt.SpringbootLogDemoApplicationTests : error
2023-10-22 17:21:16.308 WARN 8912 --- [ main] com.zmt.SpringbootLogDemoApplicationTests : wring
2023-10-22 17:21:16.313 INFO 8912 --- [ main] com.zmt.SpringbootLogDemoApplicationTests : info
2023-10-22 17:21:16.337 INFO 8912 --- [ main] com.zmt.SpringbootLogDemoApplicationTests : log4j info
可以看到输出格式是一样的,说明即使使用Log4j获取的Logger对象打印日志实际上还是logback来实现日志输出。
SpringBoot的日志配置
我们可以在aplication.properties文件中进行简单的配置
#指定自定义Logger对象的输出日志级别
logging.level.com.zmt = debug
#指定控制台输出消息格式
logging.pattern.console=[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] ===== %msg%n
#指定日志文件存放的目录,默认文件名为spring.log
logging.file.path=/logs/springboot/
#指定日志文件消息格式
logging.pattern.file=[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] ===== %msg%n
运行观察控制台和文件
但是application.properties的配置并不能满足实际需求,比如文件拆分规则等,我们可以自己添加对应日志框架的配置文件来代替application.properties的日志配置
接下来添加一个logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %M %L [%thread] %m%n"></property>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象,默认为System.out黑色字体-->
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--只输出error级别的信息-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--自定义Logger-->
<logger name="com.zmt" level="info" additivity="dalse">
<appender-ref ref="console"/>
</logger>
</configuration>
运行测试代码观察控制台输出
只输出了红色字体的error级别日志。配置文件生效
使用SpringBoot解析日志配置
如果使用SpringBoot解析日志配置我们需要将logback.xml文件修改为logback-spring.xml。因为logback.xml加载过早,无法解析扩展标签。而修改为logback-spring.xml后,可以解析SpringBoot的扩展标签。
在xml文件中添加springProfile标签
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象,默认为System.out黑色字体-->
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--开发环境下解析成一种消息格式-->
<springProfile name="dev">
<pattern>${pattern}</pattern>
</springProfile>
<!--生产环境下解析成另一种消息格式-->
<springProfile name="pro">
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} %M %L [%thread]========= %m%n</pattern>
</springProfile>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--只输出error级别的信息-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
在application.properties添加配置指定环境
#设置为开发环境
spring.profiles.active=dev
运行观察控制台是否是输出“---”
修改为pro环境后再次运行观察
可以看到输出格式不同。配置生效
SpringBoot切换日志实现
在pom文件中进行修改
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除jar包 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
运行发现又使用了log4j2的默认配置打印日志输出。