011_logback中的SMTPAppender
1. SMTPAppender在固定大小的緩沖里積累記錄事件, 當用戶指定的事件發生后, 就通過email發出這些事件。默認情況下, email發送是由級別為ERROR或更高級別的記錄事件觸發的。?
2. SMTPAppender的屬性如下
3. SMTPAppender依賴JavaMail API, 在JavaMail API 1.4版下通過測試(高版本的JavaMail暫時不支持)。
4. 事件的觸發
4.1.?如果未指定選項"Evaluator", 則SMTPAppender被默認分配一個OnErrorEveluator(ch.qos.logback.classic.boolex.OnErrorEvaluator)實例, 當遇到級別為ERROR或更高級別的事件后, 觸發email傳輸。雖然遇到錯誤就觸發email傳輸很合理, 但也可以通過提供EventEvaluator接口的不同實現來覆蓋此默認行為。
4.2.?OnErrorEveluator類的實現
4.3.?SMTPAppender對每個進來的事件都調用evaluate()方法進行評估, 為的是檢查事件是應該觸發email傳輸還是放入循環緩沖。評估結果為true時, 就發送email。SMTPAppender包含且僅包含一個求值器(evaluator)對象, 該對象可以管理自己的內部狀態。
4.4.?SMTPAppender繼承自SMTPAppenderBase, SMTPAppenderBase是發送郵件的基礎類, 里面提供了諸多發送郵件時需要的字段, 同時評估evaluate()方法也是在該類的append(E eventObject)方法里調用的。
4.5.?EventEvaluator接口的核心方法就是evaluate(E event)評估方法
4.6.?EventEvaluator接口的實現
5.?例子
5.1. 新建一個名為SMTPAppender的Java項目, 同時添加相關jar包
5.2. 在src目錄下編輯logback.xml
<configuration debug="true"><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="mail" class="ch.qos.logback.classic.net.SMTPAppender"><from>xxxxxx@qq.com</from><to>oooooo@qq.com</to><subject>測試日志</subject><smtpHost>smtp.qq.com</smtpHost><username>xxxxxx@qq.com</username><password>drnhgdgad</password><layout class="ch.qos.logback.classic.html.HTMLLayout" /> <evaluator class="com.zr.mail.MyEvaluator" /> </appender><root level="debug"><appender-ref ref="mail" /><appender-ref ref="stdout" /></root></configuration>5.3. 自定義一個MyEvaluator.java的評估類
package com.zr.mail;import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.boolex.EvaluationException; import ch.qos.logback.core.boolex.EventEvaluatorBase;/*** 自定義評估類* 項目有一條錯誤日志就發送郵件似乎有一點頻繁, 我們這里自定義一個簡單的評估類, 有5條及其以上上錯誤日志再發送郵件。*/ public class MyEvaluator extends EventEvaluatorBase<ILoggingEvent> {private int errorCount = 5;private int count;@Overridepublic boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException {if(event.getLevel().levelInt >= Level.ERROR_INT) {count++;}if(count >= errorCount) {count = 0;return true;}return false;}}5.4. 編輯MyMail.java
package com.zr.mail;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class MyMail {private static final Logger logger = LoggerFactory.getLogger(MyMail.class);public static void main(String[] args) {for(int i = 0; i < 10; i++) {logger.trace("我是一個跟蹤信息");logger.debug("我是一個測試信息");logger.info("我是一個日志信息");logger.warn("我是一個警告信息");logger.error("我是一個錯誤信息");// 停一會再退出程序, 不然郵件發不出去try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}} }5.5. 運行項目
6. 基于標記的觸發
6.1. 根據ERROR級別觸發email可能會導致產生太多email。Logback提供了另外的觸發策略: OnMarkerEvaluator(ch.qos.logback.classic.boolex.OnMarkerEvaluator)。本質上, 只有當
事件包含一個用戶指定的標記時, 才會觸發email。
6.2. 新建一個名為SMTPOnMarkerEvaluator的Java項目, 同時添加相關jar包
6.3. 在src目錄下編輯logback.xml
<configuration><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="mail" class="ch.qos.logback.classic.net.SMTPAppender"><evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> <!-- 管理員日志或者交易失敗發送郵件 --><marker>NOTIFY_ADMIN</marker><marker>TRANSACTION_FAILURE</marker></evaluator><smtpHost>smtp.qq.com</smtpHost><smtpPort>25</smtpPort><username>xxxxxxxxxx@qq.com</username><password>drnhvsbzviqgdgad</password><to>oooooooooo@qq.com</to><from>xxxxxxxxxx@qq.com</from><subject>測試日志</subject><!-- 這里只有layout沒有encoder --><layout class="ch.qos.logback.classic.PatternLayout"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></layout></appender><root level="debug"><appender-ref ref="mail" /><appender-ref ref="stdout" /></root></configuration>6.5. 運行項目
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的011_logback中的SMTPAppender的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 010_logback中的SocketA
- 下一篇: 012_logback中的DBAppen