全部配置
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<property name="LOG_HOME" value="log"/>
<property name="LOG_NAME" value="admin"/>
<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}) [%X{traceid}] %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} [%X{traceid}] ${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"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${LOG_NAME}-info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxFileSize>100MB</MaxFileSize>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${LOG_NAME}-error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxFileSize>100MB</MaxFileSize>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
2. 定义日志参数
<property name="LOG_HOME" value="log"/>
<property name="LOG_NAME" value="admin"/>
LOG_HOME
: 日志打印存放在服务器的位置LOG_NAME
: 日志文件名称(用于区分项目)- 如admin,文件名为admin-info.2024-12-17.0.log和admin-error.2024-12-17.0.log
3. 日志格式
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) [%X{traceid}] %clr(%t){cyan} %clr(:){faint} %m%n"/>
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{traceid}] %t : %m%n"/>
控制台和文件的日志输出格式分别定义,确保输出内容既清晰又易读。格式化内容包括:
%d{}
- 格式:
%d{yyyy-MM-dd HH:mm:ss.SSS}
- 含义:记录日志的时间戳,格式化为
年-月-日 小时:分钟:秒.毫秒
。 - 动态属性:
${LOG_DATEFORMAT_PATTERN}
,支持配置化日期格式,默认为yyyy-MM-dd HH:mm:ss.SSS
。
- 格式:
%clr()
- 含义:为控制台输出添加颜色区分。
{faint}
,{magenta}
,{cyan}
等指定不同的颜色样式。 - 例如:
%clr(${PID:- }){magenta}
用洋红色显示进程 ID。
- 含义:为控制台输出添加颜色区分。
%5p
- 含义:显示日志级别(如 INFO、ERROR)。
%5p
表示固定宽度为 5 个字符,右对齐。
- 含义:显示日志级别(如 INFO、ERROR)。
[%X{traceid}]
- 含义:显示上下文变量
traceid
的值。 - 用法:通过
MDC.put("traceid", "value")
在日志记录中注入traceid
。
- 含义:显示上下文变量
%t
和%15.15t
- 含义:显示线程名称。
%15.15t
表示线程名称固定宽度为 15 个字符,超出部分会截断。
%-40.40logger{39}
- 含义:记录日志的类名,显示宽度范围为 40 个字符。
{39}
指定类名路径最大为 39 层。
%m
和%n
%m
:日志消息内容。%n
:换行符。
${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
- 含义:异常栈信息的格式化输出,默认为 Logback 的
WhitespaceThrowableProxyConverter
。
- 含义:异常栈信息的格式化输出,默认为 Logback 的
3.1 生成traceid
import com.applets.manager.core.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
/**
* @author zr
*/
@Component
@Slf4j
@Order(1)
public class TraceFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
MDC.put(Constants.TRACE_ID, this.getTraceId(request));
filterChain.doFilter(request, response);
}
private String getTraceId(HttpServletRequest request) {
String traceId = request.getHeader(Constants.TRACE_ID);
if (StringUtils.isEmpty(traceId)) {
traceId = UUID.randomUUID().toString();
}
return traceId;
}
}
public class Constants {
public static final String TRACE_ID = "traceid";
/**
* 构造函数私有化,避免被实例化
*/
private Constants() {
}
}
4. 日志级别与输出
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="STDOUT"/>
</root>
根日志记录器设置为 INFO
级别,并将日志分别输出到文件和控制台:
STDOUT
: 控制台输出,方便开发时实时查看。FILE
: 记录INFO
及以上级别的日志到文件。FILE_ERROR
: 专门记录ERROR
级别日志,便于快速定位严重问题。
5. 文件滚动策略
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${LOG_NAME}-info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxFileSize>100MB</MaxFileSize>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
- MaxFileSize:表示单个日志文件的最大大小。当日志文件达到 100MB 时,它将被滚动,生成一个新的文件。这个参数确保日志文件不会因为过大而占用过多的磁盘空间,避免出现性能问题。
- MaxHistory:表示保留的最大日志历史天数。这里设置为
30
,意味着系统会保留过去 30 天的日志文件。超过 30 天的日志文件将被自动删除,从而节省存储空间。这个设置防止了日志文件积累过多,确保只有最近的日志会被保存。
6. 实际日志实例
2024-12-19 16:31:44.222 INFO [39a89345-5f86-4ddd-9d68-96ae5cffd126] 15763 --- [http-nio-8081-exec-2] c.v.manager.api.filter.TraceFilter : 清除用户数据
- 时间戳:
2024-12-19 16:31:44.222
- 日志级别:
INFO
- traceid:
39a89345-5f86-4ddd-9d68-96ae5cffd126
- 进程 ID:
15763
- 线程名称:
http-nio-8081-exec-2
- 日志类路径:
c.v.manager.api.filter.TraceFilter
- 日志消息:
清除用户数据