今天在運行某程序時出現了如上圖所示的問題,查找資料后發現是由於由於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 雖然日志信息打印出來了 可是配置的問題其實還是沒有解決