输出格式中符号含义

%-: "-"号指信息输出时左对齐
%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: 白色

案例

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>
    <!-- SpringBoot的logback的默认配置,可以打印彩色 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <!-- 获取yml配置文件中的应用名称作为属性 -->
    <springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
    <!-- 日志文件名称前缀,spring-boot-admin监控时要与yml配置的Actuator监控日志一致 -->
    <property name="log.file.prefix" value="${spring.application.name}"/>
    <!-- 日志文件路径 -->
    <property name="log.path" value="./logs"/>
    <!-- 日志最大的历史保留天数 -->
    <property name="maxHistory" value="30"/>
    <!-- 日志最大文件大小 -->
    <property name="maxFileSize" value="100MB"/>
    <!-- 字符集 -->
    <property name="charset" value="UTF-8"/>
    <!-- 文件输出格式,参考: https://blog.csdn.net/df1067/article/details/143884321 -->
    <property name="console.log.pattern" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr([%15.15thread]){faint} %clr(%39.39class{39}:%16.16method:%3line){cyan}: %m%n%wEx" />
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} [%15.15thread] %39.39class{39}:%16.16method:%3line: %m%n%wEx" />

    <!-- console控制台输出日志 -->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--日志输出格式:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%logger{50}:表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符-->
            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%class{0}.%method\(\):%line] %-5level[%logger{50}]- %msg%n</pattern>-->
            <pattern>${console.log.pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!-- info输出日志 -->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.file.prefix}-info.log</file>
        <!--滚动策略,SizeAndTimeBasedRollingPolicy必须加上maxFileSize属性-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志默认压缩路径,将超过指定文件大小的日志,进行存档,%d{yyyy-MM,aux}这个aux表示该%d是辅助配置,不需要按照此滚动打包,这样logback就可以按照后面的%d{yyyy-MM-dd}每日滚动打包 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM,aux}/${log.file.prefix}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--启动时清除历史日志-->
            <!--<cleanHistoryOnStart>true</cleanHistoryOnStart>-->
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 过滤的级别,生产环境只过滤info,防止日志太多 -->
            <springProfile name="prod">
                <level>info</level>
            </springProfile>
            <springProfile name="!prod">
                <level>debug</level>
            </springProfile>
        </filter>
    </appender>

    <!-- error输出日志 -->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.file.prefix}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM,aux}/${log.file.prefix}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
<!--            &lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            &lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;-->
<!--            <onMismatch>DENY</onMismatch>-->
        </filter>
    </appender>

    <!-- info异步输出 -->
    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="fileInfoLog"/>
    </appender>

    <!-- error异步输出 -->
    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="fileErrorLog"/>
    </appender>

    <appender name="skyWalkingLog" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!-- 配置Druid监控日志输出到单独的文件 -->
    <appender name="druid" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.file.prefix}-druid-monitor.log</file>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/${log.file.prefix}-druid-monitor.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!--druid相关logger,additivity="false" 设置打印信息行为不向上级传递-->
    <logger name="com.alibaba.druid.filter.stat.StatFilter" level="warn" additivity="false">
        <appender-ref ref="druid"/>
    </logger>

    <!--其它日志记录级别-->
    <!--logger用来配置绑定某个包或者类下的日志输出等级,以及使用哪一个appender来输出日志,additivity配置是否向上级logger传递打印信息行为,该logger的上级为root,默认true-->
    <logger name="com.xx" level="info"/>
    <logger name="com.xx.mapper" level="debug"/>
    <logger name="org.redisson" level="error"/>
    <logger name="org.apache" level="error"/>
    <logger name="io.netty" level="error"/>
    <logger name="io.lettuce" level="error"/>
    <logger name="com.alibaba" level="error"/>
    <logger name="org.springframework" level="error"/>
    <logger name="org.mybatis" level="error"/>
    <logger name="org.apache.ibatis" level="error"/>
    <logger name="com.baomidou" level="error"/>
    <logger name="reactor.util.Loggers" level="error"/>
    <logger name="org.hibernate.validator" level="error"/>
    <logger name="springfox" level="error"/>

    <root level="INFO">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="async_error"/>
        <appender-ref ref="async_info"/>
        <appender-ref ref="skyWalkingLog"/>
    </root>

</configuration>

 如果要在linux上运行有彩色,还需要在application.yml加上配置

spring:
  output:
    ansi:
      enabled: always # 总是开启ansi颜色,用来打印彩色日志
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐