日志配置文件,官方文档建议使用-spring 命令格式的配置,日志框架不直接加载,由SpringBoot解析日志配置,如:logback-spring.xml。如果直接定义为logback.xml 将直接被日志框架识别。下面详细解释下logback-spring.xml中属性的具体作用:

<configuration>
     <contextListener class="com.ofpay.logback.TtlMdcListener"/>

    <!-- 直接本配置文件配置,name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。java.io.tmpdir的值从虚拟机参数中获取:-Djava.io.tmpdir -->
    <property name="LOG_PATH"
              value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/>
    
    <!-- properties配置文件定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径。source配置文件内参数key -->
    <springProperty scope="context" name="APP_NAME"
                    source="spring.application.name" defaultValue="spring-boot-fusion"/>


    <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}——日志输出时间; $PID——进程号; %level——日志级别; ${LOG_LEVEL_PATTERN:-%5p}:用于呈现日志级别的格式(默认%5p);%t--输出日志的线程名;%-40.40logger{39}——其中的“-”表示左对齐,“{39}”表示logger名字最长39个字符,否则按照句点分割; %msg——日志消息; %n——平台的换行符; -->
    <property name="LOG_PATTERN"
              value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n"/>

    <!-- 标准输出模式 console-->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 对日志进行格式化 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 输出模式 file,滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="fileDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
        <file>${LOG_PATH}/${APP_NAME}-debug.log</file>
        <!--滚动策略  基于时间的分包策略,SizeAndTimeBasedRollingPolicy:按日期,大小记录日志 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd 时间策略则为一天一个文件,%d{yyyy-MM-dd-HH}指定日期格式,%i指定索引 -->
            
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-debug.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留小时数,此处的时间单位是从fileNamePattern的yyyy-MM-dd_HH中提取的,yyyy-MM-dd_HH精确到小时,因此单位就是小时-->
            <MaxHistory>48</MaxHistory>
            <maxFileSize>1GB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!--  layout 负责把事件转换成字符串,格式化的日志信息的输出 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
       
         <!-- 过滤策略:
            LevelFilter : 只打印level标签设置的日志级别
            ThresholdFilter:打印大于等于level标签设置的级别,小的舍弃
            当前appender=fileDebug只记录debug级别
         -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置过滤级别-->
            <level>DEBUG</level>
            <!--用于配置符合过滤条件的操作-->
            <onMatch>ACCEPT</onMatch>
            <!--用于配置不符合过滤条件的操作-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 输出模式 file,滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="fileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
        <file>${LOG_PATH}/${APP_NAME}-info.log</file>
        <!--滚动策略  基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 -->
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留小时数-->
            <MaxHistory>48</MaxHistory>
            <!--单个日志文件最大1GB-->
            <maxFileSize>1GB</maxFileSize>
            <!--日志文件总大小超过20GB会删除旧的日志文件-->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!--  layout 负责把事件转换成字符串,格式化的日志信息的输出 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
        <!--级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置过滤级别-->
            <level>INFO</level>
            <!--用于配置符合过滤条件的操作-->
            <onMatch>ACCEPT</onMatch>
            <!--用于配置不符合过滤条件的操作-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="fileWarn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}-warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 -->
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-warn.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留小时数-->
            <MaxHistory>48</MaxHistory>
            <maxFileSize>1GB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="fileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 -->
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留小时数-->
            <MaxHistory>48</MaxHistory>
            <maxFileSize>1GB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="fileAccess" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}-access.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd 时间策略则为一天一个文件 -->
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-access.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留小时数-->
            <MaxHistory>48</MaxHistory>
            <!-- 单个日志文件最大 1GB,总日志量不能超过totalSizeCap-->
            <maxFileSize>1GB</maxFileSize>
            <!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
    </appender>

    <appender name="fileSQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}-sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 -->
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-sql.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <MaxHistory>48</MaxHistory>
            <maxFileSize>1GB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
    </appender>

    <appender name="asyncDebug" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 默认情况下,当BlockingQueue还有20%容量,
        他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。
        为了保持所有的events,设置该值为0。-->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>1024</queueSize>
        <!--如果设置了neverBlock=true则写日志队列时候会调用ArrayBlockingQueue对的offer方法而不是put,而offer是非阻塞的-->
        <neverBlock>true</neverBlock>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="fileDebug"/>
    </appender>

    <appender name="asyncInfo" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 默认情况下,当BlockingQueue还有20%容量,
        他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。
        为了保持所有的events,设置该值为0。-->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>1024</queueSize>
        <!--如果设置了neverBlock=true则写日志队列时候会调用ArrayBlockingQueue对的offer方法而不是put,而offer是非阻塞的-->
        <neverBlock>true</neverBlock>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="fileInfo"/>
    </appender>

    <appender name="asyncWarn" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="fileWarn"/>
    </appender>

    <appender name="asyncError" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="fileError"/>
    </appender>

    <appender name="asyncAccess" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="fileAccess"/>
    </appender>

    <appender name="asyncSQL" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="fileSQL"/>
    </appender>

    <!-- request 日志
        additivity: 是否向上级logger传递打印信息。默认是true。
        同<logger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。
    -->
    <logger name="com.poizon.fusion.webmvc.logging.AccessLoggingFilter" level="info" additivity="false">
        <appender-ref ref="asyncAccess"/>
    </logger>

    <!--
            <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
            name:用来指定受此logger约束的某一个包或者具体的某一个类。
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。
            addtivity:是否向上级logger传递打印信息。默认是true。
    -->
    <logger name="springfox.documentation" level="OFF"/>

    <!-- springProfile多环境日志输出,根据不同环境(local:本地环境,prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,读取spring.profiles.active的值-->
    <springProfile name="local">
        <root>
            <level value="DEBUG"/>
            <appender-ref ref="asyncDebug"/>
        </root>
        <root>
            <level value="INFO"/>
            <appender-ref ref="stdout"/>
            <appender-ref ref="asyncInfo"/>
            <appender-ref ref="asyncWarn"/>
            <appender-ref ref="asyncError"/>
        </root>
    </springProfile>

</configuration>

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐