2017-10-17 73 views
0

我有一個包中有幾個類,在我的項目中有幾個包。 對於繼承,父類中的這些文件是您需要多久設置一次log4j2的配置文件?

{ // File location for log4j2.xml 
    System.setProperty("log4j.configurationFile", 
     "file:\\\\" + System.getProperty("user.dir") + "\\Properties\\log4j2.xml"); 
} 

然而,我看到ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.

所以,很顯然,一次是不夠的。

那麼我需要設置log4j.configurationFile的系統屬性的一般規則是什麼?

  • 每包一次?
  • 每班一次?
  • 每個父母/基類,不管包?
  • 還是別的什麼?

對於多個類和包,最佳實踐是什麼?

回答

3

Log4j 2在初始化時進行配置,即無論何時首次在JVM的實例內創建Logger實例,大約......您的應用程序中聲明Logger實例的第一個類會導致Log4j 2初始化自身。所以,這個問題的答案...

你需要多久設置一次log4j2的配置文件?

...是一旦

您的OP中報告的問題:No log4j2 configuration file found. Using default configuration是由於Log4j無法找到您試圖指向的配置文件而引起的。這個問題是由於不經常設置配置文件導致的而不是

根據the docs的Log4j將尋找它的配置源如下:

  1. 的Log4j將檢查「log4j.configurationFile」系統屬性,如果設置,會嘗試使用 加載配置與文件擴展名匹配的ConfigurationFactory。
  2. 如果沒有設置系統屬性,則ConfigurationFactory屬性將在類路徑中查找log4j2-test.properties。
  3. 如果沒有找到這樣的文件,YAML ConfigurationFactory將在類路徑中查找log4j2-test.yaml或log4j2-test.yml。
  4. 如果找不到這樣的文件,JSON ConfigurationFactory將在類路徑中查找log4j2-test.json或log4j2-test.jsn。
  5. 如果找不到這樣的文件,XML ConfigurationFactory將在類路徑中查找log4j2-test.xml。
  6. 如果無法找到測試文件,ConfigurationFactory的屬性將在類路徑中查找log4j2.properties。
  7. 如果無法找到屬性文件,則YAML ConfigurationFactory將在 類路徑中查找log4j2.yaml或log4j2.yml。
  8. 如果無法找到YAML文件,JSON ConfigurationFactory將在類路徑中查找log4j2.json或log4j2.jsn。
  9. 如果無法找到JSON文件,XML ConfigurationFactory將嘗試在類路徑中找到log4j2.xml。
  10. 如果找不到配置文件,將使用DefaultConfiguration。這將導致日誌記錄輸出到控制檯。

如果您嘗試設置log4j.configurationFile成功,那麼選擇1將從事但是嘗試不成功,我們知道這是因爲你引用的錯誤信息告訴我們,Log4j是爲通過對選項10下降。

我建議使用-Dlog4j.configurationFile =/path/to/log4j2.xml來運行你的應用程序,或者確保log4j2.xml在你的應用程序的類路徑上。拋棄System.setProperty(...)調用您的代碼的想法感覺像一個反模式,可能會相當脆弱,因爲任何靜態記錄器之前System.setProperty(...)調用將導致Log4j初始化自己知道您的配置文件位置之前。