如何修改覆盖spring boot默认日志策略logback详解

 更新时间:2018年10月14日 14:18:23   作者:Ryan.Miao  
这篇文章主要给大家介绍了关于如何修改覆盖spring boot默认日志策略logback的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

背景

Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。

默认日志Logback

SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。

Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。

springboot初始化了日志的默认实现,只要我们在配置文件添加对应的配置即可。

比如

logging:
 file: logs/application-debug.log
 pattern:
 console: "%d %-5level %logger : %msg%n"
 file: "%d %-5level [%thread] %logger : %msg%n"
 level:
 org.springframework.web: ERROR
 com.howtodoinjava: INFO
 org.hibernate: ERROR

可以指定日志文件名,覆盖默认的pattern,指定不同日志级别。

但依旧有很多局限性。比如,默认的文件方案是:

E:\maven\repository\org\springframework\boot\spring-boot\1.5.13.RELEASE\spring-boot-1.5.13.RELEASE.jar!\org\springframework\boot\logging\logback\file-appender.xml

 <appender name="FILE"
  class="ch.qos.logback.core.rolling.RollingFileAppender">
  <encoder>
   <pattern>${FILE_LOG_PATTERN}</pattern>
  </encoder>
  <file>${LOG_FILE}</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
   <fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
  </rollingPolicy>
  <triggeringPolicy
   class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
   <MaxFileSize>10MB</MaxFileSize>
  </triggeringPolicy>
 </appender>

只是超过10m就生成一个新文件。而我们还遇到过日志把磁盘打满的情况。肯定需要定时清理,还想要按照日期生成文件。这样,仅仅配置文件是不够的,需要我们自己定义。

自定义

实现自定义就是在resource下新增logback-spring.xml, 然后编写我们的配置方案。就是完全跳过spring的默认配置了。但我又想偷懒,还想用spring的配置,但只是修改个别,比如file。

spring默认配置文件 E:\maven\repository\org\springframework\boot\spring-boot\1.5.13.RELEASE\spring-boot-1.5.13.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml

我们只要

<include resource="org/springframework/boot/logging/logback/base.xml"/>

就可以拿过来直接用。

最初我也是这样做的,但后面发现有些东西是不能覆盖的。比如内置的日志文件名,所以,最后把base里的内容单独抽离出来用了。

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

 <springProperty scope="context" name="appName" source="spring.application.name"
 defaultValue="application"/>
 <springProperty scope="context" name="log.path" source="logging.path"
 defaultValue="logs"/>
 <springProperty scope="context" name="logstashurl" source="logstash.url"
 defaultValue="localhost:4560"/>

 <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>-->
 <include resource="org/springframework/boot/logging/logback/defaults.xml" />
 <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
 <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

 <!--输出到文件-->
 <appender name="TIME_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
 <!-- <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern>-->
 <!-- <maxHistory>7</maxHistory>-->
 <!--</rollingPolicy>-->
 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <!-- daily rollover -->
  <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <maxHistory>7</maxHistory>
  <maxFileSize>100MB</maxFileSize>
  <totalSizeCap>1GB</totalSizeCap>
 </rollingPolicy>
 <encoder>
  <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${appName} %X{req.remoteHost} %X{req.requestURI} %X{req.userAgent} %X{req.method} - [%thread] %-5level %logger{36} - %msg%n</pattern>-->
  <pattern>${FILE_LOG_PATTERN}</pattern>
 </encoder>
 </appender>

 <!-- 输出到logstash-->
 <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
 <destination>${logstashurl}</destination>
 <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
 </appender>

 <root level="INFO">
 <appender-ref ref="CONSOLE"/>
 <appender-ref ref="TIME_FILE"/>
 </root>


 <springProfile name="dev">
 <logger name="com.test.demo.mapper" level="DEBUG">
 </logger>
 </springProfile>
 <springProfile name="local, test, prod">
 <root level="warn">
  <appender-ref ref="LOGSTASH"/>
 </root>
 </springProfile>
</configuration>

同时,需要读取配置文件, 配置文件依旧生效

logging:
 path: logs
 file: ${logging.path}/${spring.application.name}

这里,include拿到spring默认配置,但移除了base里的root配置,去掉了file。并自定义file。file规则是保存7天,每100m分一个文件,总大小不超过1G。

 <springProperty scope="context" name="appName" source="spring.application.name"
 defaultValue="application"/>
 <springProperty scope="context" name="log.path" source="logging.path"
 defaultValue="logs"/>
 <springProperty scope="context" name="logstashurl" source="logstash.url"
 defaultValue="localhost:4560"/>

这一块配置并没有使用,只是放这里备份。logback里想要使用spring的配置文件的变量,只能通过这种方式读取。因为我配置了logstash,需要读取logstash的url,所以这样做。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Java中do-while循环的使用方法及注意事项详解

    Java中do-while循环的使用方法及注意事项详解

    这篇文章主要介绍了Java中do-while循环的使用方法及注意事项的相关资料,在Java编程中,do-while循环是一种基本的循环控制结构,它至少执行一次循环体,然后根据条件判断是否继续,文中将用法介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java由浅入深细数数组的操作下

    Java由浅入深细数数组的操作下

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素
    2022-04-04
  • Spring如何正确注入集合类型

    Spring如何正确注入集合类型

    这篇文章主要介绍了Spring如何正确注入集合类型,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • MyBatis使用<foreach>标签like查询报错解决问题

    MyBatis使用<foreach>标签like查询报错解决问题

    这篇文章主要介绍了MyBatis使用<foreach>标签like查询报错解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Java中的位运算符号解读(&、|、^、~、<<、>>、>>>)

    Java中的位运算符号解读(&、|、^、~、<<、>>、>>>)

    这篇文章主要介绍了Java中的位运算符号(&、|、^、~、<<、>>、>>>),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java线程队列LinkedBlockingQueue的使用

    Java线程队列LinkedBlockingQueue的使用

    本文主要介绍了Java线程队列LinkedBlockingQueue的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java 超详细带你掌握矩阵的运算

    Java 超详细带你掌握矩阵的运算

    在学习机器学习算法时,发现运用java 来实现有些算法代码时,会有很大困难,其中有一点就是 java 本身并没有矩阵运算的 api,所以进行要实现矩阵运算就尤其复杂,让我们一起了解矩阵的运算
    2022-03-03
  • idea构建web项目的超级详细教程

    idea构建web项目的超级详细教程

    好多朋友在使用IDEA创建项目时,总会碰到一些小问题,下面这篇文章主要给大家介绍了关于idea构建web项目的超级详细教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 详解如何Java中实现Excel的注释和批注

    详解如何Java中实现Excel的注释和批注

    注释及批注是 Excel 中比较常用的功能,这篇文章主要为大家详细介绍了如何在Java中实现Excel的注释和批注,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Java 电话号码的组合示例详解

    Java 电话号码的组合示例详解

    这篇文章主要介绍了Java 电话号码的组合,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论