1. 一个很常见的需求
一个Springboot工程开发直到上线,需要有开发环境、测试环境、生产环境,各个环境对日志输出的路径要求是不一样的,需要在不同环境的配置文件里指定不同环境的日志路径(你可能不是使用这种方法,后面再说)。
2. 如果你去查资料,很容易找到以下方法
Springboot工程可以设置不同环境的配置文件,比如开发环境application-dev.yml、测试环境application-test.yml、生产环境application-prod.yml,然后在这些yml文件里分别设置日志根目录
logging:
path: {你要的日志输出目录}
在logback-spring.xml中通过
<springProperty scope="context" name="logPath" source="logging.path"/>
就能获得yml配置的日志目录并赋值给${logPath}
,然后在logback-spring.xml
文件中其他位置就可以通过${logPath}
获取到这个目录并使用。
这个方法是可以的。但是还有一点小问题。
3. 2中方法的问题
按照2中配置,启动工程时,工程根目录下会生成一个文件夹logPath_IS_UNDEFINED
(到目前为止提到了3次logPath
,如果你用别的名字也可以,而不是非要用logPath
),里面是日志文件,在你指定的日志输出目录,也会生成相应的日志文件。
我们仔细看两处的日志文件,logPath_IS_UNDEFINED
记录的是Springboot的图标出现之前的日志,指定目录里面记录的是Springboot的图标出现之后的日志,Springboot图标表示Springboot开始加载,这时候才能从yml文件读取配置。Springboot图标说的就是下面这个东西:
原因:加载日志是在加载Springboot之前的,刚开始记录日志的时候Springboot还没有开始工作(这个顺序是合理的,可以自己思考)。
4. 有没有解决办法?
有。 参考文档在文章末尾。
- 参考文档1、2的方法,增加了一个默认日志存储位置,实际上只是名字不叫
logPath_IS_UNDEFINED
,效果是一样的。 - 参考文档3说的方法,很麻烦,我跟作者一样建议你不要用。
5. 不解决行不行?
行,因为加载日志配置的日志,即加载Springboot之前的日志,丢了实在无关紧要。
6. 我就是要解决这个问题,还要简洁一点,可不可以?
可以。回到1中提到的“你可能不是使用这种方法,后面再说”,可以在启动jar包时,加上-Dlogging.path={你要的日志输出目录}
,不等Springboot去读取yml配置文件,直接就有了日志目录这个变量,交给logback-spring.xml
文件去使用。
有什么缺点?回到了原点,日志目录要在启动脚本去配置,而不能在yml配置文件中预先写好。(让我做这个日志配置的运维偷懒失败)。