目录
1. 简介
2. 项目结构

3. 配置文件
3.1 Maven
<properties>
<slf4j.version>1.7.32</slf4j.version>
<logback.version>1.2.5</logback.version>
</properties>
<dependencies>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
3.2 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>${APP_NAME}</contextName>
<springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
<springProperty name="LOG_FILE" scope="context" source="logging.file" defaultValue="../logs"/>
<springProperty name="LOG_POINT_FILE" scope="context" source="logging.file" defaultValue="../logs/point"/>
<springProperty name="LOG_MAXFILESIZE" scope="context" source="logback.filesize" defaultValue="50MB"/>
<springProperty name="LOG_FILEMAXDAY" scope="context" source="logback.filemaxday" defaultValue="7"/>
<springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
<springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<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="[${APP_NAME}:${ServerIP}:${ServerPort}] [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<property name="CONSOLE_LOG_PATTERN_NO_COLOR"
value="[${APP_NAME}:${ServerIP}:${ServerPort}] [%X{traceId},%X{X-B3-TraceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 控制台日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="com.demo.example.config.MyLogBackFilter"/>
</appender>
<!-- 按照每天生成常规日志文件 -->
<!-- 不用的时候注释掉,防止生成无用的空白文件 -->
<!-- <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <file>${LOG_FILE}/${APP_NAME}-error.log</file>-->
<!-- <!– 基于时间的分包策略 –>-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${LOG_FILE}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>-->
<!-- <maxFileSize>100MB</maxFileSize>-->
<!-- <!–保留时间,单位:天–>-->
<!-- <maxHistory>60</maxHistory>-->
<!-- </rollingPolicy>-->
<!-- <encoder>-->
<!-- <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>-->
<!-- <charset>UTF-8</charset>-->
<!-- </encoder>-->
<!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!-- <MaxFileSize>100MB</MaxFileSize>-->
<!-- </triggeringPolicy>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter"><!– 只打印错误日志 –>-->
<!-- <level>ERROR</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!-- 按照每天生成常规日志文件 -->
<!-- 不用的时候注释掉,防止生成无用的空白文件 -->
<!-- <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <file>${LOG_FILE}/${APP_NAME}-info.log</file>-->
<!-- <!– 基于时间的分包策略 –>-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${LOG_FILE}/${APP_NAME}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>-->
<!-- <maxFileSize>100MB</maxFileSize>-->
<!-- <!–保留时间,单位:天–>-->
<!-- <maxHistory>60</maxHistory>-->
<!-- </rollingPolicy>-->
<!-- <encoder>-->
<!-- <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>-->
<!-- <charset>UTF-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>INFO</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!-- 按照每天生成常规日志文件 -->
<appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}/${APP_NAME}/${APP_NAME}.jar.log</file>
<!-- 基于时间的分包策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}/${APP_NAME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<!--保留时间,单位:天-->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 增加无关日志的显示等级 -->
<logger name="com.ulisesbocchio" level="INFO"/>
<logger name="com.netflix" level="INFO"/>
<logger name="com.zaxxer.hikari" level="INFO"/>
<logger name="com.baomidou" level="INFO"/>
<logger name="org" level="INFO"/>
<logger name="_org" level="INFO"/>
<logger name="io" level="INFO"/>
<!-- 设置输出级别 -->
<!-- 如果不需要根据环境区分配置,则不需要使用springPorfile -->
<!-- <root>-->
<!-- <appender-ref ref="STDOUT"/>-->
<!-- <appender-ref ref="ALL"/>-->
<!-- </root>-->
<!-- 根据环境区分 -->
<!-- 设置输出级别,开发环境(根据spring.profiles.active判断) -->
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ALL"/>
<!-- <appender-ref ref="ERROR"/>-->
<!-- <appender-ref ref="INFO"/>-->
</root>
</springProfile>
<!-- 设置输出级别,生产环境(根据spring.profiles.active判断) -->
<springProfile name="prod">
<root level="DEBUG">
<!-- <appender-ref ref="STDOUT"/>-->
<appender-ref ref="ALL"/>
<!-- <appender-ref ref="ERROR"/>-->
<!-- <appender-ref ref="INFO"/>-->
</root>
</springProfile>
</configuration>
3.3 application.yml
spring:
application:
name: spring-boot-logback # 用于生成日志文件名
profiles:
active: dev # 用于根据环境输出不同日志级别
4. 自定义输出级别
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
/**
* <p> @Title MyLogBackFilter
* <p> @Description 定制控制台日志过滤器
*
* @author ACGkaka
* @date 2022/1/6 11:15
*/
public class MyLogBackFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
// 指定打印日志类(供控制台用)
if (event.getLoggerName().contains("org.springframework.boot")
&& !event.getLoggerName().contains("org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration")
&& !event.getLoggerName().contains("org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration")) {
// 打印启动信息
return FilterReply.ACCEPT;
} else if (event.getLevel().equals(Level.ERROR)) {
// 打印异常信息
return FilterReply.ACCEPT;
} else {
return FilterReply.DENY;
}
}
}
5. 项目地址
Github:https://github.com/ACGkaka/SpringBootExamples/tree/main/springboot-logback
测试地址:http://localhost:8080/tUser/findAll
6. 部分内容没有输出到日志文件中问题处理
e.printStackTrace() 和 System.out.println() 不会输出到日志。
如果要输出到日志,需要增加如下依赖:
<!-- System.out System.err 转 info -->
<dependency>
<groupId>uk.org.lidalia</groupId>
<artifactId>sysout-over-slf4j</artifactId>
<version>1.0.2</version>
</dependency>
启动类中进行如下设置:
public static void main(String[] args) {
// 加入这行代码时system.out输出为info日志
SysOutOverSLF4J.sendSystemOutAndErrToSLF4J();
// 启动应用
SpringApplication.run(SpringbootDemoApplication.class, args);
}
整理完毕,完结撒花~ 🌻