關於log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).的問題


 

 

今天在運行某程序時出現了如上圖所示的問題,查找資料后發現是由於由於log4j這個日志信息打印模塊的配置信息沒有給出造成的,簡單的說就是人家要有個地方來存放日志的打印信息,可是你又不給人家,所以就報錯了吧

解決辦法:

在你的項目的src目錄中創建一個名為log4j.properties的文本文件,記住是文本文件,不是文件夾

然后在你的文本文件中加入如下的內容:

# Configure logging for testing: optionally with log file  
  
#log4j.rootLogger=debug,appender  
log4j.rootLogger=info,appender  
#log4j.rootLogger=error,appender  
  
#\u8F93\u51FA\u5230\u63A7\u5236\u53F0  
log4j.appender.appender=org.apache.log4j.ConsoleAppender  
#\u6837\u5F0F\u4E3ATTCCLayout  
log4j.appender.appender.layout=org.apache.log4j.TTCCLayout

 

我去==沒成功 啥原因 繼續找

根據錯誤提示中的鏈接到Apache官網找日志信息,然鵝(ಥ_ಥ)全是英文 不行 硬着頭皮也得把他弄懂了

其實也還蠻簡單的 大致上就是說log4j的配置文件沒有找到並且應用程序執行的時候沒有顯示配置,而log4j呢,是依靠Thread.getContextClassLoader().getResource() 這兩個類去定位文件的默認信息而不是直接去查他的文件系統,而你要將log4j放在合適的位置就需要知道類裝入器(class loader大致是這么個理)的搜索策略,log4j沒有提供一個默認的配置不管是輸入到控制台還是到文件系統中,不過也可能在某些環境中被禁止。嗶嗶了半天,就是和文章開頭我言簡意賅的解釋一樣

 

並沒有解決問題,所以接着看:

簡單的說就是 log4j的類和屬性文件不在同一個類加載器的范圍。

不簡單的說==就是 J2EE或servlet容器利用java的類加載系統,Sun改變了方法與java 2的發布方式,在java類裝載器2,被安排在一個分層的parent-child關系,當一個子類的類加載器需要找到一個類或資源,它首先代表父類的要求。

log4j只使用默認的類加載類forname()機制 結論就是:所以,如果你有問題,嘗試自己加載類或資源 

看樣子Apache的log也沒幫到忙

最后在外網上找到一個回答:

將該方法插入到main函數中,可以自行打印日志信息了

BasicConfigurator.configure(); //自動快速地使用缺省Log4j環境。

然后測試程序沒有問題:

 

 ------------------------------------------------------------------------------------

BUT 雖然日志信息打印出來了 可是配置的問題其實還是沒有解決


免責聲明!

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



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