修改覆蓋springboot默認日志策略logback


目錄

背景

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,所以這樣做。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM