最近在别人基础上写代码,但是发现一个框架中写了好多日志输出的配置文件,比如logback-dev.xml,logback-beta.xml,logback-prod.xml,其实总结起来就是 除了日志输出目录不同外,其余的全部相同。于是呼我就开始了优化。思想如下:
1.springboot项目默认便是logback日志框架,默认配置文件是logback-spring.xml【优点:该名称日志文件,是默认加载的,不用配置logging.config属性,且加载顺序是在属性配置文件之后加载,也就是说,logback-spring.xml 可以读取到 application.yml文件中的属性】
2.所有日志配置文件用logback-spring.xml文件接受,日志输出目录作为变量传入即可。
然,所有的成功绝非一蹴而就,启动的时候总是在当前目录的根目录下自动生成一个目录:LOG_PATH_IS_UNDEFINED
以前玩那么多遍了,今天却栽了跟头,虽然不影响功能,但是“莫名其妙”多增加了一个日志目录心里还是不舒服的。凭着一股子牛劲,研究吧。
1.新搭建一个干净的框架,发现功能好使,没有额外目录生成。--》结论:maven不知引用了某个依赖,所以导致日志配置文件加载顺序在属性文件之前启动了。
2.回想最近新增的依赖,开始逐个删除,并反复测试日志输出,最后在移除spring-cloud-starter-netflix-eureka-client依赖时,日志输出正常。--》结论:eureka影响了logback-spring日志文件
3.向度娘请教,最后发现springcloud优先加载bootstrap.properties/bootstrap.yml,因为我没有该配置文件,找不到我定义的日志输出目录参数,所以日志配置文件先生成了默认的日志目录以及 默认文件。
4.思考:为什么没有bootstrap.yml文件时,会生成一个默认LOG_PATH_IS_UNDEFINED,而其后还会生成我指定的日志输出目录和文件呢?我理解的是不会再生成我指定的目录了
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<fileNamePattern>${LOG_PATH}/${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-7}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-0}</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="org.springframework" level="error" additivity="false"/>
<logger name="org.hibernate" level="error" additivity="false"/>
<logger name="com.mchange" level="error" additivity="false"/>
<logger name="org.apache" level="error" additivity="false"/>
<logger name="net.sf" level="error" additivity="false"/>
<springProfile name="dev | test">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
logging.
path: /usr/logs
file: test.log