【springboot】logback配置

在Spring Boot中,默认使用的是Logback作为日志框架。要配置Logback,可以在src/main/resources目录下创建一个名为logback-spring.xml的文件,然后在其中添加以下配置:

在 Logback 中,日志的输出被称为 appender,包含控制台输出、文件输出、网络输出等多种方式。以下是一个简单的 Logback 配置文件示例:

范例

<?xml version="1.0" encoding="UTF-8"?>  
<configuration>  
    <include resource="org/springframework/boot/logging/logback/base.xml" />  
      
    <!-- 日志输出级别 -->  
    <root level="INFO">  
        <appender-ref ref="CONSOLE"/>  
        <appender-ref ref="FILE"/>  
    </root>  
      
    <!-- 控制台输出 -->  
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
        </encoder>  
    </appender>  
      
    <!-- 文件输出 -->  
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <file>logs/app.log</file>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 每天滚动 -->  
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>  
            <!-- 保留 7 天的日志 -->  
            <maxHistory>7</maxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
        </encoder>  
    </appender>  
</configuration>

在这个配置文件中,我们首先引入了Spring Boot默认的日志配置,然后定义了根日志级别(INFO),以及控制台和文件输出。控制台输出使用了ConsoleAppender,文件输出使用了RollingFileAppender,并配置了滚动策略。

最后,我们将这两个 appender 关联到 root 节点中,表示所有日志都会输出到这两个地方。

除了这些常用的配置,Logback 还提供了很多高级特性,例如过滤器、异步输出等。根据实际需求,可以选择相应的配置方案。

可以根据自己的需求调整日志级别、输出格式、文件存储路径等参数。

实战

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
       说明:
       1、日志级别及文件
           日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中
           例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志,
           日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名
           例如log-level-2013-12-21.0.log
           其它级别的日志也是如此。
       2、文件路径
           若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。
           若部署到Tomcat下,则在Tomcat下的logs文件中
       3、Appender
           FILEERROR对应error级别,文件名以log-error-xxx.log形式命名
           FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名
           FILEINFO对应info级别,文件名以log-info-xxx.log形式命名
           FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名
           stdout将日志信息输出到控制上,为方便开发测试使用
    -->
    <contextName>logback</contextName>
     <!-- 日志文件输出位置 -->
    <property name="LOG_PATH" value="./webserverLog" />
    <!-- 单个日志文件最大值 -->
    <property name="maxFileSize" value="2MB" />

    <!-- ERROR 日志记录器,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/log_error.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径及格式,归档日志文件路径可以与file指定文件路径不同。%d{yyyy-MM-dd}指定日期格式,%i指定索引 如:log-error-2020-05-19.68.log-->
            <fileNamePattern>${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]  %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录error级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 设置过滤级别 -->
            <level>ERROR</level>
            <!-- 用于配置符合过滤条件的操作 -->
            <onMatch>ACCEPT</onMatch>
             <!-- 用于配置不符合过滤条件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

   <!-- WARN 日志记录器-->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/log_warn.log</file>

        <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>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <append>true</append>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]  %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- INFO 日志记录器-->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_PATH}/log_info.log</file>

        <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>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <append>true</append>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]  %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--DEBUG 日志记录器 -->
    <appender name="FILEDEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_PATH}/log_debug.log</file>

        <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>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <append>true</append>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]  %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 控制台输出日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoder 默认配置为PatternLayoutEncoder-->
        <encoder>
            <!-- 设置日志输出格式 -->
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]  %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <!-- 自定义监控日志记录器-->
    <appender name="MONITORLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_PATH}/log_monitor.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/monitor/log-monitor-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <append>true</append>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]  %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

<!--     <appender name="DB" class="com.croot.monitor.appender.SynDBAppender">-->
<!--	    <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">-->
<!--	        <dataSource class="com.alibaba.druid.pool.DruidDataSource">-->
<!--	            &lt;!&ndash; DruidDataSource 中的属性配置 &ndash;&gt;-->
<!--	            <driverClassName>org.sqlite.JDBC</driverClassName>-->
<!--	            <url>jdbc:sqlite:monitor.db</url>-->
<!--	            <username></username>-->
<!--	            <password></password>-->
<!--	        </dataSource>-->
<!--	    </connectionSource>-->
<!--	</appender>-->

<!--	<appender name="ASYNC_DB" class="ch.qos.logback.classic.AsyncAppender">-->
<!--	    <appender-ref ref="DB" />-->
<!--	</appender>-->

<!--	<appender name="ERRORDB" class="com.croot.monitor.appender.SynDBAppender">-->
<!--	    <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">-->
<!--	        <dataSource class="com.alibaba.druid.pool.DruidDataSource">-->
<!--	            &lt;!&ndash; DruidDataSource 中的属性配置 &ndash;&gt;-->
<!--	            <driverClassName>org.sqlite.JDBC</driverClassName>-->
<!--	            <url>jdbc:sqlite:monitor.db</url>-->
<!--	            <username></username>-->
<!--	            <password></password>-->
<!--	        </dataSource>-->
<!--	    </connectionSource>-->
<!--	     &lt;!&ndash; 此日志文件只记录error级别的 &ndash;&gt;-->
<!--	    <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--	        &lt;!&ndash; 设置过滤级别 &ndash;&gt;-->
<!--	        <level>ERROR</level>-->
<!--	        &lt;!&ndash; 用于配置符合过滤条件的操作 &ndash;&gt;-->
<!--	        <onMatch>ACCEPT</onMatch>-->
<!--	         &lt;!&ndash; 用于配置不符合过滤条件的操作 &ndash;&gt;-->
<!--	        <onMismatch>DENY</onMismatch>-->
<!--	    </filter>-->
<!--	</appender>-->

<!--	<appender name="ASYNC_ERRORDB" class="ch.qos.logback.classic.AsyncAppender">-->
<!--	    <appender-ref ref="ERRORDB" />-->
<!--	</appender>-->

	 <logger name="com.croot.framework.logger.aspect" level="INFO" additivity="false">
	        <appender-ref ref="MONITORLOG"/>
<!--	        <appender-ref ref="ASYNC_DB" />-->
	 </logger>

<!--	<logger name="com.croot.framework.logger.BizLogger" level="INFO" additivity="false">-->
<!--	        <appender-ref ref="MONITORLOG"/>-->
<!--	        <appender-ref ref="ASYNC_DB" />-->
<!--	 </logger>-->

     <!-- mybatis日志打印 org.apache.ibatis包下的类的日志输出-->
    <logger name="org.apache.ibatis" level="WARN" />
    <logger name="java.sql" level="WARN" />


    <!-- 生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能 -->
    <root level="INFO">
        <appender-ref ref="FILEERROR" />
        <appender-ref ref="FILEWARN" />
        <appender-ref ref="FILEDEBUG" />
        <appender-ref ref="FILEINFO" />
<!--        <appender-ref ref="ASYNC_ERRORDB" />-->

        <!-- 生产环境将请stdout去掉 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

配置时间

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${logBase}/${appName}-server.log</file>
    <!--SizeAndTimeBasedRollingPolicy策略继承了TimeBasedRollingPolicy策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!--每天生成一个文件 %i表示序号 从0开始-->
        <fileNamePattern>${logBase}/${appName}-server-%d{yyyy-MM-dd}.log.%i</fileNamePattern>
        <!--每个文件的大小限制-->
        <MaxFileSize>100MB</MaxFileSize>
        <!--最多保留10天的文件,10天之前的将被清除-->
        <MaxHistory>10</MaxHistory>
        <!--该滚动策略日志的总大小,超过的日志会被清除-->
        <totalSizeCap>1GB</totalSizeCap>
        <!--启动时清理日志文件  此项置灰清理超过保留天数的  也会清理超过总大小的-->
        <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{TRACE_ID}] %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>