• 修改覆盖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 epositoryorgspringframeworkootspring-boot1.5.13.RELEASEspring-boot-1.5.13.RELEASE.jar!orgspringframeworkootlogginglogbackfile-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 epositoryorgspringframeworkootspring-boot1.5.13.RELEASEspring-boot-1.5.13.RELEASE.jar!orgspringframeworkootlogginglogbackase.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,所以这样做。

  • 相关阅读:
    HashMap源码分析
    静态代理和装饰模式的区别
    自动内存管理
    ReentrantReadWriteLock
    ReentranLock
    对象的内存布局
    对象的创建
    [P2495][SDOI2011]消耗战——虚树
    [HDU2966]In case of failure——KD树
    [Gym-101158J]Coverthe Polygon with Your Disk——梯度下降,模拟退火
  • 原文地址:https://www.cnblogs.com/woshimrf/p/springboot-logback-config.html
Copyright © 2020-2023  润新知