Logback初始化失敗問題排查(Web.xml中context-param配置詳解)


監控部分反饋異常,生產系統日志文件竟然木有了(最后一次版本發布后,再也無日志文件生成)。

 

問題排查步驟:

1. 檢查logback配置文件

 日志生成目錄一切正常

 應該服務器上磁盤空間未滿、操作權限沒有問題。

   pass

2. 檢查應用中logback對象是否加載成功

   在web.xml中,通過context-param指定日志文件路徑異常。

    問題查找出來了。

 

錯誤的配置如下:

    <context-param>
        <param-name>logbackConfigLocation</param-name>
        <param-value>file:/opt/pay/config/masopen/logback_masopen.xml</param-value>
        <param-name>webAppRootKey</param-name> 
        <param-value>masopen</param-value> 
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/META-INF/spring/masopen_service.xml
            classpath:/META-INF/spring/masopen_task.xml
            classpath:/META-INF/spring/masopen_api_cxf.xml    
        </param-value>
    </context-param>

很明顯的錯誤,在<context-param>中竟然定義了2組<param-name>和<param-value>,自然以最下面定義的那組為准。

這種低級錯誤,竟然在代碼評審中沒有審查出來。

 

知識擴展:

1. context-param定義

<context-param>
    <param-name>webAppRootKey</param-name> 
    <param-value>masopen</param-value> 
</context-param>

2.   context-param初始化過程

初始化過程:
在啟動Web項目時,容器(比如Tomcat)會讀web.xml配置文件中的兩個節點<listener><contex-param>。
接着容器會創建一個ServletContext(上下文),應用范圍內即整個WEB項目都能使用這個上下文。
接着容器會將讀取到<context-param>轉化為鍵值對,並交給ServletContext。
容器創建<listener></listener>中的類實例,即創建監聽(備注:listener定義的類可以是自定義的類但必須需要繼承ServletContextListener)。
在監聽的類中會有一個contextInitialized(ServletContextEvent event)初始化方法,在這個方法中可以通過event.getServletContext().getInitParameter("contextConfigLocation") 來得到context-param 設定的值。在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷毀方法.用於關閉應用前釋放資源,比如說數據庫連接的關閉。
得到這個context-param的值之后,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比所有的Servlet都要早。

3.   context-param如何使用

頁面中
${initParam.contextConfigLocation}
Servlet中
String paramValue=getServletContext().getInitParameter("contextConfigLocation")

 


免責聲明!

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



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