SpringBoot的默认使用
观察SpringBoot的Maven依赖图
可以看出来,SpringBoot默认使用的日志系统是使用Slf4j作为门户,logback作为日志实现
编写一个测试代码看是否是这样
@SpringBootTest
class SpringbootLogDemoApplicationTests {//使用Slf4j来创建LOGGER对象public static final Logger LOGGER = LoggerFactory.getLogger(SpringbootLogDemoApplicationTests.class);@Testpublic 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的默认配置打印日志输出。