【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>


目录
相关文章
|
9月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1250 0
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
1270 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
6月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
553 4
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1317 5
|
7月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
379 0
探索Spring Boot的@Conditional注解的上下文配置
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1719 0
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
317 0
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
1270 0
|
8月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1396 10
|
9月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1507 1
下一篇
开通oss服务