關於log4j發郵件的功能,就是在項目上線使用後,為了更好的維護系統,我們可以將記錄項目情況的log以郵件形式發送給administor,及時瞭解系統遇到的問題。並且及時修正,更高效方便。
準備流程:
1、首先準備log4j-1.2.15.jar,注意只有log4j-1.2.14.jar後的版本方支援郵件發送功能。以及郵件發送的jar包activation.jar、mail.jar。
2、在項目中架好log4j:首先在src源檔案下建立一個log4j.properties,並在原先內容後追加如下:
## MAIL log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender # 記錄error等級得錯誤 log4j.appender.MAIL.Threshold=ERROR #當日誌到達126k時,發送郵件 log4j.appender.MAIL.BufferSize=126 #郵件伺服器 log4j.appender.MAIL.SMTPHost=smtp.163.com #是否列印調試資訊 log4j.appender.MAIL.SMTPDebug=true #郵件主題 log4j.appender.MAIL.Subject=Log4J ErrorMessage #郵箱登陸帳號 log4j.appender.MAIL.SMTPUsername=***@163.com #郵箱登陸密碼 log4j.appender.MAIL.SMTPPassword=*** #郵件發送方 log4j.appender.MAIL.From=***@163.com #郵件接收方 log4j.appender.MAIL.To=***@163.com #日誌顯示格式 log4j.appender.MAIL.layout.ConversionPattern==%d{yyyy-MM-dd HH:mm:ss} - %c -%-4r [%t] %-5p %c %x - %m %l%n
到這裡,如果你操作沒問題,其實可以測試一下,應該就可以將log中的記錄成功發送到指定郵箱中。但是,如果有中文錯誤資訊,你是否發現有亂碼呢。。別苦惱,有辦法解決。
其實日誌顯示格式都是指定了某一個layout,羅列幾種顯示方式: (哎……不能用圖片)
SimpleLayout:ERROR-在關鍵字"from"附件有錯誤。
HTMLLayout:顯示類似表格顯示效果:
Time Thread Level Category Message
0 http-8080-1 ERROR dao.DownloadDao 在關鍵字"from"附近有語法錯誤
Layout是個抽象類別,其子類是很多種顯示格式,那麼比如我想用HTMLLayout,那麼我定義一個類,讓其繼承HTMLLayout,然後重寫其getContentType方法,另外因為上面這幾種layout顯示方式沒有顯示出錯誤所在,不方便進行錯誤定位,所以我們可以自己寫上一個方法,我也自己寫了個,在此貼出來供大家參考。
package dao; import org.apache.log4j.Layout; import org.apache.log4j.SimpleLayout; import org.apache.log4j.spi.LoggingEvent; public class MailEvaluator extends Layout{ StringBuffer sbuf; @Override public String getContentType() { return "text/html;charset=GBK"; } public MailEvaluator() { sbuf = new StringBuffer(128); } @Override public String format(LoggingEvent event) { sbuf.setLength(0); sbuf.append("錯誤等級:"+event.getLevel().toString()+"==="); sbuf.append("錯誤原因:"+event.getMessage().toString()+"==="); sbuf.append("錯誤所在類"+event.getLocationInformation().getClassName()+"==="); sbuf.append("錯誤方法所在:"+event.getLocationInformation().getMethodName()+"==="); sbuf.append("錯誤行:"+event.getLocationInformation().getLineNumber()); return sbuf.toString(); } @Override public boolean ignoresThrowable() { // TODO Auto-generated method stub return false; } public void activateOptions() { // TODO Auto-generated method stub } }
其實主要就是覆蓋了基類中兩個方法,這樣就基本完成了利用log4j發郵件,並且能夠正確定位錯誤所在,以便及時修正。
效果就是:
錯誤等級:ERROR===錯誤原因:在關鍵字 'from' 附近有語法錯誤。
錯誤所在類dao.DownloadDao===錯誤方法所在:doLogin===錯誤行:97