Springboot不同环境配置不同日志路径以及LOG_PATH_IS_UNDEFINED错误
来源于 https://www.jianshu.com/p/637d075b5dd8
Springboot不同环境配置不同日志路径以及LOG_PATH_IS_UNDEFINED错误
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"/>
就能获得{你要的日志输出目录}
,然后在logback-spring.xml
文件中就可以通过${logPath}
获取到这个目录并使用。
这个方法是可以的。但是有问题。
3. 2中方法的问题
按照2中配置,启动工程时,工程根目录下会生成一个文件夹logPath_IS_UNDEFINED
(请注意,到目前为止提到了3次logPath
,如果你用的是别的名字,就是别的String,而不是固定的logPath
),里面是日志文件,在你指定的日志输出目录,也会生成相应的日志文件。
我们仔细看两处的日志文件,logPath_IS_UNDEFINED
记录的是Springboot的图标出现之前的日志,指定目录里面记录的是Springboot的图标出现之后的日志,Springboot图标表示Springboot开始加载,这时候才能从yml文件读取配置。Springboot图标说的就是下面这个东西:
最根本的原因:加载日志是在加载Springboot之前的,刚开始记录日志的时候Springboot还没有开始工作(这个顺序是合理的,可以想想)。
4. 有没有解决办法?
有。 参考文档在最下面7中。
- 参考文档1、2的方法,增加了一个默认日志存储位置,实际上只是名字不叫
logPath_IS_UNDEFINED
,效果是一样的。 - 参考文档3说的方法,很麻烦,我跟作者一样建议你不要用。
- 参考文档4跟列出来,就是为了告诉你有的人真的是在抄教程,自己不试一试,然后还说亲测可用。其中有一个人和3的观点一样。
5. 不解决行不行?
行,因为加载日志配置的日志,丢了实在无关紧要。
6. 我就是要解决这个问题,还要简洁一点,可不可以?
可以。回到1中提到的“你可能不是使用这种方法,后面再说”,可以在命令行启动jar包时,加上-Dlogging.path={你要的日志输出目录}
,不等Springboot去读取yml配置文件,直接就有了日志目录这个变量,交给logback-spring.xml
文件去使用。
有什么缺点?回到了原点,日志目录还是运维去配置,而不能让开发在配置文件中预先写好。运维偷懒计划失败。
7.参考
-----------------------------其实我的问题貌似不是上面的,我是IDEA开发环境中中不停的打----------------------------------------------------------------------------------------------------
CONSOLE_LOG_PATTERN_IS_UNDEFINED
只要加上
<include resource="org/springframework/boot/logging/logback/base.xml" />
就搞定了
--------------------------------------------------------------------------------------------