Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          Log4j的郵件功能能夠為我們做這樣的事情----當程序運行完的時候,或者正在運行也是可以的,它將程序的日志通過郵件的方式發到你的郵箱上。

          ??? 這樣,對于程序運行的控制就不用每次都跑到機器上去看日志文件這么麻煩了,我們需要的只是,開開Foxmail,用用鼠標,就可以知道,程序到底運行的怎么樣了。

          ???

          • ??? 使用log4j-1.2.15

          ?????????????? 之前用的是 log4j-1.2.8 ,照理說,它們之間的版本號的區別夠小,應該沒有什么區別,但是事實卻讓我丈二摸不著頭腦。

          ?????????????發送郵件的一個重要的類是SMTPAppender。

          ???????????? 在1.2.8的版本中,SMTPAppender沒有smtpPassword 和smtpUsername 屬性。這兩個屬性分別是登錄smtp服務器用的用戶名和密碼。筆者到現在也沒有想明白,在通常的情況下怎樣才可以不登錄smtp服務器就可以發送郵件了。 有知道的朋友,就留個言吧,先謝過啦。

          ????????????? 由于不能解決上面的那個問題,我就只好使用1.2.15這個版本啦。

          • ???log4j.properties文件

          ???????????

          Java代碼
          1. log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender??
          2. ??
          3. log4j.appender.MAIL.BufferSize=10??
          4. ??
          5. log4j.appender.MAIL.From=yourname@?domain.com??
          6. ??
          7. log4j.appender.MAIL.SMTPHost=mail.domain.com??
          8. ??
          9. log4j.appender.MAIL.Subject=Log4J?Message??
          10. ??
          11. log4j.appender.MAIL.To=target@domain.com??
          12. ??
          13. log4j.appender.MAIL.SMTPUsername=username??
          14. ??
          15. log4j.appender.MAIL.SMTPPassword=password??
          16. ??
          17. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout??
          18. ??
          19. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout??
          20. ??
          21. log4j.appender.MAIL.layout.ConversionPattern=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n??

          ???????????這個文件配好以后,恭喜你,現在log4j的郵件功能,你就可以體會了。

          • ? SMTP的級別默認是ERROR級別的,怎么辦

          ???????????? 默認的級別是ERROR級別的,那就是說,只有程序出錯了,你才可以收到郵件,很顯然,這還不能滿足我們日常管理的要求。我們需要自定義的級別。

          ??????????? 為此,筆者繼承了TriggeringEventEvaluator類,覆蓋里面的一個方面,如下所示

          Java代碼
          1. @Override??
          2. ????public?boolean?isTriggeringEvent(LoggingEvent?arg0)?{??
          3. ????????return?arg0.getLevel().isGreaterOrEqual(Level.INFO);??
          4. ????}??

          ?

          • ?? 每遇到一個觸發事件就發一封郵件!

          ??????????? SMTPAppender 實現是,每當isTriggeringEvent()這個方法返回true的時候,它都會發送郵件。這樣的話,一個程序執行下來,每個有能力觸發的事件都會形成一封郵件。這顯然不是我們希望看到的場面。

          ??????????? 筆者繼承了SMTPAppender類,重裝了append方法。??????????

          Java代碼
          1. @Override??
          2. ????public?void?append(LoggingEvent?event)?{??
          3. ??
          4. ????????if?(!checkEntryConditions())?{??
          5. ????????????return;??
          6. ????????}??
          7. ??
          8. ????????event.getThreadName();??
          9. ????????event.getNDC();??
          10. ????????event.getMDCCopy();??
          11. ????????if?(this.getLocationInfo())?{??
          12. ????????????event.getLocationInformation();??
          13. ????????}??
          14. ????????cb.add(event);??
          15. ????????if?(evaluator.isTriggeringEvent(event))?{??
          16. ????????????if?(cb.length()?>?this.getBufferSize()?/?2)?{??
          17. ????????????????sendBuffer();??
          18. ????????????}??
          19. ??
          20. ????????}??
          21. ????}??

          ????????? 這樣的話,當事件的個數達到bufferSize的一半的時候就會發一封郵件了。

          ????????? 但是另外一個問題也隨之產生了,當程序結束時,還在緩沖里面的事件是不會被發送出來的。因為事件數往往沒有bufferSize的一半。

          ?????????

          Java代碼
          1. public???*****SMTPAppender()?{??
          2. ????????Runtime.getRuntime().addShutdownHook(new?Thread()?{??
          3. ??
          4. ????????????@Override??
          5. ????????????public?void?run()?{??
          6. ????????????????if?(cb.length()?>?0)?{??
          7. ????????????????????sendBuffer();??
          8. ????????????????}??
          9. ??
          10. ????????????}??
          11. ??
          12. ????????});??
          13. ????}??

          ?

          ???????? 筆者在構造函數中,添加了一個程序結束時運行的線程,來處理這個問題。

          • ? 設置Html格式的輸出

          ??????????? 按照剛剛筆者給出的配置文件,所產生的郵件的格式是純文本的。其實log4j有網頁格式的輸出的。

          ???????????

          Property文件代碼
          1. log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout??

          ?

          ????????? 這樣的話,郵件就好看很多啦。

          • ? 解決郵件中的中文亂碼問題

          ??????????? 最后,你會發現中文是亂碼的,而且HTMLLayout沒有提供編碼方式的屬性設置,哎,又是一陣無語中。

          ?????????? 得,筆者也就只好再寫一個類,繼承HTMLLayout,覆蓋getContentType方法

          ??????????

          Java代碼
          1. @Override??
          2. ????public?String?getContentType()?{??
          3. ????????return?"text/html;charset=GBK";??
          4. ??
          5. ????}??

          ?????????? 添加上述功能之后的配置文件如下所示:

          Java代碼
          1. log4j.appender.MAIL.To=target@domain.com??
          2. ??
          3. log4j.appender.MAIL.From=yourname@domain.com??
          4. ??
          5. log4j.appender.MAIL.SMTPHost=smtp.domain.com??
          6. ??
          7. log4j.appender.MAIL.Subject=?Information??
          8. ??
          9. log4j.appender.MAIL.SMTPUsername=username??
          10. ??
          11. log4j.appender.MAIL.SMTPPassword=password??
          12. ??
          13. log4j.appender.MAIL.EvaluatorClass=com.wole.***.MailEvaluator??
          14. ??
          15. log4j.appender.MAIL.layout=com.wole.log4j.net.DefaultLayOut?
          posted on 2009-07-22 11:12 禮物 閱讀(1554) 評論(0)  編輯  收藏 所屬分類: Log
          主站蜘蛛池模板: 辉县市| 永济市| 江西省| 越西县| 泸定县| 沂南县| 九寨沟县| 池州市| 阜宁县| 开平市| 张北县| 陈巴尔虎旗| 桂平市| 奉贤区| 娱乐| 民权县| 嘉定区| 岐山县| 芦山县| 谷城县| 涿州市| 曲周县| 昌都县| 龙山县| 元朗区| 通江县| 乌拉特后旗| 徐汇区| 万盛区| 北辰区| 澄迈县| 酉阳| 仙居县| 电白县| 宁蒗| 莎车县| 土默特右旗| 珲春市| 河池市| 宣汉县| 兴业县|