Spring boot+ logback環境下,日志存放路徑未定義的問題


日志路徑未定義

  • 環境:Spring boot + logback
  • 配置文件:
    <configuration>
    <springProfile name="dev">
        <property name="LOGHOME" value="/logdir/dir"></property>
    </springProfile>
    <appender name="syslog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOGHOME}/sys.log
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:SSS} %p [%thread] (%file:%line)- %m%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
  • 問題:
    • 描述:微服務項目啟動時,項目src同級目錄下會新建一個以日志路徑變量名為命名的文件夾。例如上面File標簽中的<File>LOG_HOME。
    • 原因:logback先於Spring boot初始化(可以打開logback的debug查看項目初始化日志),logback初始化時會去查找LOG_HOME變量的值,但是上面的配置<springProfile>標簽已經決定了該LOG_HOME的值由Spring來解析,所以先行初始化的logback找不到該變量的值,導致出現上面描述的情況。
    • 補充:雖然logback在項目剛剛啟動時,沒有找到LOG_HOME的值,但是當Spring Boot初始化到文件解析出LOG_HOME的值時,LOG_HOME的值不再是IS_UNDEFINED的了,而是上面定義的我們想要的路徑。
    • 分析:據stackoverflow上的大神,logback不支持文件的懶加載(其實這個問題想都不用想,spring boot都開始加載了,logback怎么能不先初始化?)。我們這里的問題其實是因為動態改變導致的:開發在windows環境,部署在Linux環境,這就要求開發和生產環境的日志不在相同的路徑,但是如果不依賴Java代碼,logback是無法在xml文件中動態解析變量值的。
  • 解決方案:
    • 方案1:實現logback的接口,從文件中動態加載變量值,比如我們的application.yml文件里的環境屬性dev、prod,以這些值為條件為logback的context添加變量LOG_HOME,及對應的值。這種方案,要新增logback相關代碼,並且要在spring boot加載前執行,非常不好!
    • 方案2:添加額外的jar包,在xml文件中進行條件判斷。這種方案太麻煩了,xml文件新增好幾倍。
    • 方案3:在上面的文件中新增一個 <property name="LOG_HOME" value = "logdir">屬性,作為logback初始化時LOG_HOME變量的默認值。這個默認值推薦采用部署服務器上的路徑。這種方案最簡單,成本最低:沒有方案1的代碼污染,沒有方案2的jar包引入和一大堆xml標簽。【最佳實踐】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM