【springboot】logback配置

简介: 【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>


目录
相关文章
|
1月前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
1月前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
27 1
|
5天前
|
消息中间件 设计模式 Java
SpringBoot+Schedule 定时任务的配置开关
SpringBoot+Schedule 定时任务的配置开关
12 0
SpringBoot+Schedule 定时任务的配置开关
|
8天前
|
Java Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之Web函数启动的Spring Boot项目可以通过什么方式配置Nginx
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
21天前
|
JSON JavaScript Java
SpringBoot读取配置优先级顺序是什么?
Spring Boot的外部配置加载优先级是开发者理解和管理应用程序配置的关键。它支持多种配置源,包括Java属性文件、YAML文件、环境变量、命令行参数等。配置加载顺序从低到高为:默认属性、@PropertySource加载的配置、Config Data(内部配置文件、外部配置文件)、环境变量、系统属性、Servlet容器初始化参数、SPRING_APPLICATION_JSON格式的环境变量或系统属性以及命令行参数。了解这一顺序有助于在不同环境中灵活配置和管理Spring Boot应用,确保其按预期运行。
|
23天前
|
Java 数据库连接 网络安全
springboot使用Pivotal Greenplum JDBC如何进行配置
【5月更文挑战第23天】springboot使用Pivotal Greenplum JDBC如何进行配置
41 6
|
25天前
|
Java 应用服务中间件 Maven
SpringBoot概述&SpringBoot基础配置&yml的使用&多环境启动
SpringBoot概述&SpringBoot基础配置&yml的使用&多环境启动
35 2
|
26天前
|
Java Python Spring
小唐开始学 Spring Boot——(2)Spring Boot核心配置与注解
小唐开始学 Spring Boot——(2)Spring Boot核心配置与注解
|
1月前
|
Java 微服务 Spring
Spring Boot中获取配置参数的几种方法
Spring Boot中获取配置参数的几种方法
29 2
|
1月前
|
Web App开发 前端开发 Java
SpringBoot配置HTTPS及开发调试
在实际开发过程中,如果后端需要启用https访问,通常项目启动后配置nginx代理再配置https,前端调用时高版本的chrome还会因为证书未信任导致调用失败,通过摸索整理一套开发调试下的https方案,特此分享
29 0
SpringBoot配置HTTPS及开发调试