來源於 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" />
就搞定了
--------------------------------------------------------------------------------------------