前言
@SLF4J配置结构
configuration:配置根目录
conversionRule:彩色日志,配置之后控制台输出的日志信息是彩色的,非常好看
appender:日志输出配置规则
file:日志文件输出路径
encoder:日志文件输出格式
pattern:日志文件输出模板格式
charset:日志文件输出编码方式
rollingPolicy:日志记录器的滚动策略;简单来说就是一天过后把前一天的日志文件名变成 "2021-xx-xx.log";每个日志文件最大尺寸多少,超过尺寸后多余部分生成一个新的日志文件等,一些动态的策略处理
fileNamePattern:滚动策略输出日志文件目录,及文件名模板;以尺寸策略来说,超过10m的文件,多余部分输出的文件名和路劲为appender的file值,已满10m的部分输出路径为此值
timeBasedFileNamingAndTriggeringPolicy:设置日志文件尺寸滚动策略
maxFilesSize:单个日志文件最大size
maxHistory:日志文件最大保存时间
filter:日志文件记录数据过滤器
level:只记录对应等级的记录
onMatch:常量:ACCEPT
onMismatch:常量:DENY
root:设置日志记录写入和控制器打印等级,低于这个等级的记录不写入日志文件,不在控制器打印
appender-ref:日志规则生效列表,值为appender对应的name属性,只有name存在appender-ref的appender配置才会生效;
logger:指定某个报下的日志输出规则,配置之后只要是这个包下产生的记录,都是遵循此规则,并且与root中配置的appender-ref重复的话,会叠加生效
appender-ref:使用的日志生成规则
springProfile:设置不同环境的配置,上诉标签除了configuration都可以放置在此标签内;会根据不同的环境,使用不同的规则
案例详解
configuration
配置文件的根节点
<?xml version="1.0" encoding="UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="10 seconds" debug="false"> <conversionRule ....></conversionRule> <root ....></root> <appender ...></appender> </configuration>
conversionRule
配置完彩色日志后,就可以在模板内使用彩色变量,使得输出的日志记录变成彩色的,稍后在pattern中举例使用彩色变量,现在先配置
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds" debug="false">
......一些其他的配置
<!-- 彩色日志 -->
<!-- conversionWord:指定在pattern中使用的别名 -->
<!-- converterClass:指定使用彩色日志渲染类 -->
<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"/> <!-- 彩色日志格式 --> </configuration>
appender
日志输出规则
<!--输出到控制台--> <!-- name 表示规则名称,提供与root -> appender-ref 的使用--> <!-- class 表示使用的日志输出类 ConsoleAppender表示为控制台日志输出类,使用此类日志会输出的控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- 配置日志输出过滤条件--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 只输出info等级及以上的日志--> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <level>info</level> </filter> <!-- 配置日志输出格式--> <encoder> <!-- 日志输出格式模板,请注意一下格式是为了更好的描述,在打印的时候出现换行情况,实际使用要将其写成一行,换行符由%n代替--> <Pattern> ${ CONSOLE_LOG_PATTERN:- //常量 %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} //%clr表示使用conversionRule中conversionWord为clr的converterClass输出()中的变量文本;%d表示日期;{faint}表示颜色;颜色值有[faint:灰白,red,green,yellow,blue,magenta,cyan] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} } </Pattern> <!-- 日志输出字符集,没错就是为了解决中文乱码--> <charset>UTF-8</charset> </encoder> </appender>
Pattern中特殊符号含义
-X号: X信息输出时左对齐; %p: //输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, %d: //输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %r: //输出自应用启动到输出该log信息耗费的毫秒数 %c: //输出日志信息所属的类目,通常就是所在类的全名 %t: //输出产生该日志事件的线程名 %l: //输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10) %x: //输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 %%: //输出一个”%”字符 %F: //输出日志消息产生时所在的文件名称 %L: //输出代码中的行号 %m://输出代码中指定的消息,产生的日志具体信息 %n: //输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
根据等级设置多个日志输出规则,把不同等级的日志分别存储,配置多个appender
<!-- 设置一个变量,以免Pattern重复复制模板表达式--> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--输出到控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--输出到文件--> <!-- 时间滚动输出 level为 DEBUG 日志 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_debug.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录debug级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_info.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 WARN 日志 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_warn.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>1KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 ERROR 日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_error.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>