如何修改覆盖springboot默认⽇志策略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\l
<appender name="FILE"
class="ch.olling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.olling.FixedWindowRollingPolicy">
<fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
</rollingPolicy>
<triggeringPolicy
class="ch.olling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
只是超过10m就⽣成⼀个新⽂件。⽽我们还遇到过⽇志把磁盘打满的情况。肯定需要定时清理,还想要按照⽇期⽣成⽂件。这样,仅仅配置⽂件是不够的,需要我们⾃⼰定义。
⾃定义
实现⾃定义就是在resource下新增l,然后编写我们的配置⽅案。就是完全跳过spring的默认配置了。但我⼜想偷懒,还想⽤spring的配置,但只是修改个别,⽐如file。
spring默认配置⽂件 E:\maven\repository\org\springframework\boot\spring-boot\1.5.13.RELEASE\sprin
g-boot-
1.5.13.RELEASE.jar!\org\springframework\boot\logging\l
我们只要
<include resource="org/springframework/boot/logging/l"/>
就可以拿过来直接⽤。
最初我也是这样做的,但后⾯发现有些东西是不能覆盖的。⽐如内置的⽇志⽂件名,所以,最后把base⾥的内容单独抽离出来⽤了。
<?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/l"/>-->
<include resource="org/springframework/boot/logging/l" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${pdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/l" />
<!--输出到⽂件-->
<appender name="TIME_FILE" class="ch.olling.RollingFileAppender">
<!--<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern>-->
<!-- <maxHistory>7</maxHistory>-->
<!--</rollingPolicy>-->
<rollingPolicy class="ch.olling.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} %Host} %questURI} %X{req.userAgent} %hod} - [%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.der.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="TIME_FILE"/>
</root>
<springProfile name="dev">
<logger name="st.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,所以这样做。
总结log4j2自定义日志文件名
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。