一、格式说明
%-: "-"号指信息输出时左对齐
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss.SSS},输出类似:2024-11-19 14:06:50.029
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%method: 输出代码中的方法名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
%wEx: 用来输出异常栈跟踪信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格
为保持日志的整洁可在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20class:指定输出class,最小的宽度是20,如果class的名称小于20的话,默认的情况下右对齐
2)%-20class:指定输出class,最小的宽度是20,如果class的名称小于20的话,"-"号指定左对齐
3)%.30class:指定输出class,最大的宽度是30,如果class的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格
4)%20.30class:如果class小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉
彩色日志输出格式:
%highlight:颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色
%boldMagenta: 粗红
%magenta: 洋红
$cyan: 青色
%white: 白色
二、常用logback-spring.xml示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60seconds" debug="false">
<!--定义日志存放目录-->
<property name="logPath" value="logs"/>
<property name="logName" value="app"/>
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<property name="LOG_PATH" value="logs/${APP_NAME}"/>
<!--日志输出的格式-->
<!-- 彩色日志(IDE下载插件才可以生效) -->
<!-- 彩色日志依赖的渲染类 -->
<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{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}}"/>
<!-- 普通日志格式 -->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
<contextName>logback</contextName>
<!--输出到控制台ConsoleAppender-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式layout-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</layout>
<!--过滤器,只有过滤到指定级别的日志信息才会输出,如果level为ERROR,那么控制台只会输出ERROR日志-->
<!--<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!--<level>ERROR</level>-->
<!--</filter>-->
</appender>
<!--正常的日志文件,输出到文件中-->
<appender name="fileDEBUGLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File>的日志都是当天的。-->
<File>${logPath}/${logName}_info.log</File>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!--如果只是想要Info级别的日志,只是过滤info还是会输出Error日志,因为Error的级别高,所以我们使用下面的策略,可以避免输出Error的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤Error-->
<level>Error</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--滚动策略,按照时间滚动TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/${logName}_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
</appender>
<!--输出ERROR日志到指定的文件中-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File>的日志都是当天的。-->
<File>${logPath}/${logName}_error.log</File>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!--如果只是想要Error级别的日志,那么需要过滤一下,默认是info级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--滚动策略,按照时间滚动TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/${logName}_error_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
</appender>
<!--指定最基础的日志输出级别-->
<root level="DEBUG">
<!--appender将会添加到这个loger-->
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileDEBUGLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
<!--定义指定package的日志级别,additivity="false":阻止日志事件传递到父记录器,避免重复输出-->
<logger name="org.springframework" level="ERROR" additivity="false"></logger>
<logger name="org.mybatis" level="DEBUG"></logger>
<logger name="java.sql.Connection" level="DEBUG"></logger>
<logger name="java.sql.Statement" level="DEBUG"></logger>
<logger name="java.sql.PreparedStatement" level="DEBUG"></logger>
<logger name="com.fast.auth.controller" level="INFO"></logger>
<!--定义com.xxx..xx..xx包下的日志信息不上传,直接输出到fileDEBUGLog和fileErrorLog这个两个appender中,日志级别为DEBUG-->
<logger name="com.xxx.xxx.xx" additivity="false" level="DEBUG">
<appender-ref ref="fileDEBUGLog"/>
<appender-ref ref="fileErrorLog"/>
</logger>
<!--
yml中的配置:
logging:
level:
#全局日志配置
root: INFO
#包级别日志配置
com.fast.auth.controller: INFO
xml中的配置
<logger name="com.fast.auth.controller" level="DEBUG"></logger>
经验证:application.yml中的日志配置优先级高于logback-spring.xml中的日志配置
-->
</configuration>