監控部分反饋異常,生產系統日志文件竟然木有了(最后一次版本發布后,再也無日志文件生成)。
問題排查步驟:
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")