欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-06 20:20:14
背景 spring boot在所有内部日志中使用commons logging,但是默认配置也提供了对常用日志的支持,如:java util logging,log4...

背景

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,所以这样做。

总结

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