011_logback中的SMTPAppender
1. SMTPAppender在固定大小的緩沖里積累記錄事件, 當(dāng)用戶指定的事件發(fā)生后, 就通過email發(fā)出這些事件。默認(rèn)情況下, email發(fā)送是由級(jí)別為ERROR或更高級(jí)別的記錄事件觸發(fā)的。?
2. SMTPAppender的屬性如下
3. SMTPAppender依賴JavaMail API, 在JavaMail API 1.4版下通過測(cè)試(高版本的JavaMail暫時(shí)不支持)。
4. 事件的觸發(fā)
4.1.?如果未指定選項(xiàng)"Evaluator", 則SMTPAppender被默認(rèn)分配一個(gè)OnErrorEveluator(ch.qos.logback.classic.boolex.OnErrorEvaluator)實(shí)例, 當(dāng)遇到級(jí)別為ERROR或更高級(jí)別的事件后, 觸發(fā)email傳輸。雖然遇到錯(cuò)誤就觸發(fā)email傳輸很合理, 但也可以通過提供EventEvaluator接口的不同實(shí)現(xiàn)來覆蓋此默認(rèn)行為。
4.2.?OnErrorEveluator類的實(shí)現(xiàn)
4.3.?SMTPAppender對(duì)每個(gè)進(jìn)來的事件都調(diào)用evaluate()方法進(jìn)行評(píng)估, 為的是檢查事件是應(yīng)該觸發(fā)email傳輸還是放入循環(huán)緩沖。評(píng)估結(jié)果為true時(shí), 就發(fā)送email。SMTPAppender包含且僅包含一個(gè)求值器(evaluator)對(duì)象, 該對(duì)象可以管理自己的內(nèi)部狀態(tài)。
4.4.?SMTPAppender繼承自SMTPAppenderBase, SMTPAppenderBase是發(fā)送郵件的基礎(chǔ)類, 里面提供了諸多發(fā)送郵件時(shí)需要的字段, 同時(shí)評(píng)估evaluate()方法也是在該類的append(E eventObject)方法里調(diào)用的。
4.5.?EventEvaluator接口的核心方法就是evaluate(E event)評(píng)估方法
4.6.?EventEvaluator接口的實(shí)現(xiàn)
5.?例子
5.1. 新建一個(gè)名為SMTPAppender的Java項(xiàng)目, 同時(shí)添加相關(guān)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>測(cè)試日志</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. 自定義一個(gè)MyEvaluator.java的評(píng)估類
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;/*** 自定義評(píng)估類* 項(xiàng)目有一條錯(cuò)誤日志就發(fā)送郵件似乎有一點(diǎn)頻繁, 我們這里自定義一個(gè)簡(jiǎn)單的評(píng)估類, 有5條及其以上上錯(cuò)誤日志再發(fā)送郵件。*/ 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("我是一個(gè)跟蹤信息");logger.debug("我是一個(gè)測(cè)試信息");logger.info("我是一個(gè)日志信息");logger.warn("我是一個(gè)警告信息");logger.error("我是一個(gè)錯(cuò)誤信息");// 停一會(huì)再退出程序, 不然郵件發(fā)不出去try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}} }5.5. 運(yùn)行項(xiàng)目
6. 基于標(biāo)記的觸發(fā)
6.1. 根據(jù)ERROR級(jí)別觸發(fā)email可能會(huì)導(dǎo)致產(chǎn)生太多email。Logback提供了另外的觸發(fā)策略: OnMarkerEvaluator(ch.qos.logback.classic.boolex.OnMarkerEvaluator)。本質(zhì)上, 只有當(dāng)
事件包含一個(gè)用戶指定的標(biāo)記時(shí), 才會(huì)觸發(fā)email。
6.2. 新建一個(gè)名為SMTPOnMarkerEvaluator的Java項(xiàng)目, 同時(shí)添加相關(guān)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"> <!-- 管理員日志或者交易失敗發(fā)送郵件 --><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>測(cè)試日志</subject><!-- 這里只有l(wèi)ayout沒有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. 運(yùn)行項(xiàng)目
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的011_logback中的SMTPAppender的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 010_logback中的SocketA
- 下一篇: 012_logback中的DBAppen