# SpringBoot日志
# Logback
# 简介
Logback是SpringBootde默认框架,是 Log4j 的后继者,提供了比 Log4j 更好的性能和功能
Logback当前分成三个模块:
logback-core
是其它两个模块的基础模块。logback-classic
是log4j的一个改良版本。它完整实现了SLF4J
API。可以更换成其它日志系统如log4j。logback-access
访问模块与Servlet (opens new window)容器集成提供通过Http来访问日志的功能。
# 核心组件
Logger: 日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等。
Layout: 负责把事件转换成字符串,格式化的日志信息的输出。
在Logback中Layout对象被封装在encoder
中。
# 配置文件
Logback提供了3种配置文件,默认加载顺序如下:
- logback-test.xml
- logback.groovy
- logback.xml
如果都不存在则采用默认的配置
打印级别:TRACE
<DEBUG
<INFO
<WARN
<ERROR
,默认DEBUG
配置文件示例:logback配置文件比较灵活,包含0或多个<appender>
、0或多个<logger>
、最多一个<root>
元素
<?xml version="1.0" encoding="UTF-8" ?>
<!--文件命名为logback.xml或logback-spring.xml,建议logback-spring.xml-->
<!--
scan: 是否启用配置文件自动扫描,默认false
scanPeriod:配置文件自动扫描的时间间隔,格式为: "数字+空格+单位",如60 seconds, 2minutes,默认为1分钟
debug: 启用 Logback 的调试模式,默认false
packagingData: 每行日志都输出包信息其所在jar包信息
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false" packingData="false">
<!-- 从spring配置文件中读取变量并应用到本文件 -->
<!--<springProperty name="size_max" source="size_max"/>-->
<!--<springProperty name="days_max" source="days_max"/>-->
<property name="size_max" value="100MB"/>
<property name="days_max" value="365"/>
<!-- windows 日志存储目录 和执行java -jar 命令时同级的 logs目录-->
<property name="logDir" value="./logs"/>
<!-- linux 日志存储目录 -->
<!-- <property name="logDir" value="${user.dir}/../logs"/>-->
<!-- 分隔符 -->
<property name="separator" value="-"/>
<!-- 设置日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} ${separator} %-5level ${separator} ${serverName}
${separator} ${PID} ${separator} ${HOSTNAME} ${separator} %X{requestId} ${separator} %-25logger{20} ${separator}
%-4line ${separator} %msg%n"/>
<!--控制台输出日志设置-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--encoder:指定输出日志格式化和字符集-->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到日志滚动文件-->
<!--FileAppender将日志事件追加到指定日志文件中-->
<!--使用RollingFileAppender,继承继承自FileAppender,支持日志分片和历史日志的自动删除-->
<!--
RollingFileAppender执行流程:
1、日志始终追加写入指定的日志文件中,若文件不存在则自动创建
2、按rollingPolicy配置的策略,当满足策略时,自动将file重命名为rollingPolicy中指定的归档日志文件名,生成历史归档日志,如 /temp/test.2023-04-12.log,并对归档日志进行压缩 和 过期日志删除。
3、循环 1-2
-->
<appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件的路径-->
<File>${logDir}/info.log</File>
<!--append:true | false,是否以追加的方式写到日志文件,默认true-->
<append>true</append>
<!--encoder:指定输出日志格式化和字符集-->
<encoder>
<charset>UTF-8</charset>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<!--prudent:安全模式,性能较差,一般不开启,默认false-->
<prudent>false</prudent>
<!--滚动(归档)策略, TimeBasedRollingPolicy:按照时间滚动(归档),超出指定时间范围的日志自动删除;
SizeAndTimeBasedRollingPolicy:按时间和文件大小滚动(归档)
-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中-->
<FileNamePattern>${logDir}/arch/info/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志保留时长(天)-->
<maxHistory>${days_max}</maxHistory>
<!--单个日志文件最大容量-->
<maxFileSize>${size_max}</maxFileSize>
<!--maxHistory内日志最大容量,到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
<!--cleanHistoryOnStart:项目启动时是否清理归档日志,默认false-->
<cleanHistoryOnStart>false</cleanHistoryOnStart>
</rollingPolicy>
</appender>
<!--将warn、error日志单独存储一份 -->
<appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">java
<!--过滤器,过滤满足条件或者不满足条件的日志
LevelFilter:级别过滤器,匹配指定的日志级别
ThresholdFilter:阈值过滤器,匹配等于或高于指定级别的日志
-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logDir}/error.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logDir}/arch/error/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 单个日志文件大小 -->
<maxFileSize>${size_max}</maxFileSize>
<!--只保留最近多少天的日志-->
<maxHistory>${days_max}</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--
name 指定记录日志的类的全限定名称
level 指定级别,可以精细化定义每个类的日记记录方式
additivity 是否将日志消息传递给父记录器,设置为false,避免重复输出
-->
<logger name="com.sw.controller" level="warn" additivity="false">
<!-- ref 是前文定义的appender的name属性 -->
<appender-ref ref="console"/>
</logger>
<!--建议在<root>中引用所有<appender>-->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="infoLog"/>
<appender-ref ref="errorLog"/>
</root>
</configuration>
# 日志输出格式
%-10level
级别 案例为设置10个字符,左对齐%d{yyyy-MM-dd HH:mm:ss.SSS}
日期%c
当前类全限定名%M
当前执行日志的方法%L
行号%thread
线程名称%m
或者%msg
信息%n
换行
# Log4j2
# JUL
Java Util Logging 是 Java 标准库自带的日志框架。
# SLF4J
SLF4J(Simple Logging Facade for Java)是一个日志门面,它允许你在不同的日志实现之间进行切换。
SLF4J 本身并不实现日志记录功能,它依赖于其他实际的日志实现