一 门面日志选择
- commons-logging,Apache出品的门面日志框架,现在不再使用,了解即可。
- Slf4j ,英文全称为“Simple Logging Facade for Java”,为java提供的简单日志Facad(springboot parent已经依赖)
所以门面日志我们直接选择Slf4j就行了
二 实现日志选择
常用的日志实现框架有JUL(Java Util Logging)、log4j、logback、log4j2
性能方面我没有做具体的测试,但是据说
logback
比log4j
功能更加强大,性能更加好;log4j2
与logback
功能相似,但前者的性能更好
最重要的是SpringBoot 集成了Slf4j + logback
,可能也从另一个侧面表示logback
综合性能表现还是不错的,所以选择Slf4j + logback
不需要额外添加依赖
三 如何在SpringBoot中配置
1. 默认输出格式解释
默认情况下输出以下项目:
2024-01-14T23:15:32.940+08:00 INFO 16512 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9527 (http) with context path '/goods'
2024-01-14T23:15:32.945+08:00 INFO 16512 --- [ main] com.ychen.goods.GoodsApplication : Started GoodsApplication in 1.197 seconds (process running for 1.404)
2024-01-14T23:15:36.678+08:00 INFO 16512 --- [nio-9527-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/goods] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-01-14T23:15:36.678+08:00 INFO 16512 --- [nio-9527-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2024-01-14T23:15:36.679+08:00 INFO 16512 --- [nio-9527-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2024-01-14T23:15:36.712+08:00 INFO 16512 --- [nio-9527-exec-2] c.y.goods.controllers.GoodsController : visit count: 1
-
日期和时间:毫秒精度且易于排序
-
日志级别:
ERROR
、WARN
、INFO
、DEBUG
、 或TRACE
-
进程 ID
-
---
用于区分实际日志消息开始的分隔符 -
线程名称:用方括号括起来(可能会被截断以用于控制台输出)
-
相关 ID:如果启用跟踪(上面的示例中未显示)
-
记录器名称:这通常是源类名称(通常是缩写)
-
消息内容
2. 创建logback-spring.xml文件
Spring的加载顺序:logback.xml --> application.properties --> logback-spring.xml
注意:日志系统是在Spring上下文之前创建的,因此不能使用@PropertySource配置,建议使用 logback-spring.xml
3. 自定义输出格式
创建logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 设置日志输出格式 -->
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} | %X{trace_uuid} | %level | %thread | %c:%L | %msg%n"/>
<property name="LOG_HOME" value="D:\\temp\\log"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<appender name="AppLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日志文件的名称 -->
<file>${LOG_HOME}\\all.log</file>
<!--
当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
%i:当文件大小超过maxFileSize时,按照i进行文件滚动
-->
<fileNamePattern>${LOG_HOME}\\%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件。 -->
<MaxHistory>3</MaxHistory>
<!--
当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志输出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<!-- 设置root logger -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="AppLogAppender" />
</root>
</configuration>
输出格式如下:
"%d{yyyy-MM-dd HH:mm:ss.SSS} | %X{trace_uuid} | %level | %thread | %c:%L | %msg%n"
注意:%X{trace_uuid} 需要在日志输出前加入以下代码(后面会详细说明如何在SpringBoot项目加入trace_uuid 并实现应用调用过程的传递)
import org.slf4j.MDC;
MDC.put("trace_uuid", UUID.randomUUID().toString().replace("-", ""));
输出样例如下:
2024-01-15 00:06:55.160 | bd7e43339a08414b93012bdaf640e844 | INFO | http-nio-9527-exec-2 | com.ychen.goods.controllers.GoodsController:30 | visit count: 1
2024-01-15 00:09:50.755 | b84fdd8fb4b5465fad4a504d2db194d9 | INFO | http-nio-9527-exec-5 | com.ychen.goods.controllers.GoodsController:30 | visit count: 2
2024-01-15 00:09:51.426 | 2676e9c0214c45a59f5321253d94c550 | INFO | http-nio-9527-exec-6 | com.ychen.goods.controllers.GoodsController:30 | visit count: 3
RollingFileAppender 配置了滚动输出,当日期滚动后会出现滚动,另外当文件大小大于maxFileSize也会触发滚动