Log4j 自动发送日志邮件

来源:互联网 发布:黑马程序员怎么找工作 编辑:程序博客网 时间:2024/05/03 09:42

Log4j发送日志邮件的作用:项目错误信息能及时(实时)反映给项目维护人员以及相关负责人。

补充:发送邮件的一个重要的类是SMTPAppender,版本低于log4j-1.2.14.jar不支持SMTP认证(SMTPAppender中没有SMTPPassword 和SMTPUsername 属性,这两个属性分别是登录SMTP服务器发送认证的用户名和密码)。

1. 简单操作

1) 项目采用maven工程,使用Log4j发送日志邮件需要如下Jar包:

log4j-1.2.15.jar(版本低于log4j-1.2.14.jar不支持SMTP认证)

mail.jar

activation.jar

pom.xml配置文件:

<!-- log相关包 --><dependency><groupId>slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.5.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.5.11</version></dependency><dependency><groupId>org.apache</groupId><artifactId>log4j</artifactId><version>1.2.15</version></dependency><!-- Email --><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency>

2) log4j.properties文件配置(key的定义参考文章《Log4j基本使用方法》)

log4j.rootLogger=info,console,MAILlog4j.logger.org.apache.mina.filter.logging.LoggingFilter=WARNlog4j.logger.com.playsnail.core.web.filter.IdentityFilter=WARNlog4j.logger.com.d1xn.common.log.Log=WARNlog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=[%p-%d{yyyy/MM/dd/HH\:mm\:ss}]%c{1}.(%L) - %m%nlog4j.appender.console.Threshold=INFO######################send error through email.######################log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender#日志的错误级别log4j.appender.MAIL.Threshold=ERROR#缓存文件大小,日志达到2时发送Email#log4j.appender.MAIL.BufferSize=2#发送邮件的服务器log4j.appender.MAIL.SMTPHost=smtp.126.com#邮件主题log4j.appender.MAIL.Subject=Log4JErrorMessage#发送邮件箱的用户log4j.appender.MAIL.SMTPUsername=yin_jw123@126.com#发送邮件箱的密码log4j.appender.MAIL.SMTPPassword=yinjianwei#发送邮件箱log4j.appender.MAIL.From=yin_jw123@126.com#接受邮件箱log4j.appender.MAIL.To=yin_jw@qq.com,yin_jw456@126.com#发送邮件的格式log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout

log4j.properties放在(source folder)目录下,这样发布到tomcat中,配置文件就在 WEB-INF\classes 文件夹下(参考文章《eclipse package,source folder,folder区别及相互转换》)

Log4j的SMTP的级别默认是ERROR级别,只有调用logger.error("***")方法,才能发送邮件。

3) 测试邮件发送功能

import org.apache.log4j.Logger;import org.apache.log4j.net.SMTPAppender;import com.snail.base.log.DefineLayOut;public class TestLog4jSendMail {static Logger logger = Logger.getLogger(TestLog4jSendMail.class);SMTPAppender appender = new DefineSMTPAppender();public TestLog4jSendMail() {try {appender.setSMTPUsername("yin_jw123@126.com");appender.setSMTPPassword("yinjianwei");appender.setTo("yin_jw456@126.com");appender.setFrom("yin_jw123@126.com");// SMTP服务器 smtp.163.comappender.setSMTPHost("smtp.126.com");appender.setLocationInfo(true);appender.setSubject("Test Mail From Log4J");appender.setLayout(new DefineLayOut());appender.activateOptions();logger.addAppender(appender);logger.error("测试");} catch (Exception e) {e.printStackTrace();logger.info("Printing ERROR Statements", e);}}public static void main(String args[]) {new TestLog4jSendMail();}}

4) 测试读取配置文件,发送邮件

import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class Log4jSendMail {public static void main(String args[]) throws InterruptedException {// 读取Log4j.properties配置文件PropertyConfigurator.configure(Log4jSendMail.class.getResource("/log4j.properties"));Logger logger = Logger.getLogger(Log4jSendMail.class);int i = 0;while (i < 6) {i += 1;logger.error("Do you received message?");}}}

2. 注意点

1) log4j.properties配置文件

log4j.rootLogger=info,console,MAIL

需要加上MAIL,否则不会调用邮件发送类,发送邮件

2) 邮件中文乱码问题

自定义DefineLayOut类,继承HTMLLayout类,同时配置文件也需要做相应的修改。

import org.apache.log4j.HTMLLayout;public class DefineLayOut extends HTMLLayout {public String getContentType() {// 修改编码方式return "text/html;charset=UTF-8"; }}
log4j.appender.MAIL.layout=com.snail.base.log.DefineLayOut

3) 利用缓存,分批发送邮件

另外一个问题也随之产生了,当程序结束时,还在缓冲里面的事件是不会被发送出来的,因为事件数往往没有bufferSize的一半。同时配置文件也需要做相应的修改。

import org.apache.log4j.net.SMTPAppender;import org.apache.log4j.spi.LoggingEvent;public class DefineSMTPAppender extends SMTPAppender {public DefineSMTPAppender() {// 将缓冲中的事件发送邮件(事件数没有达到bufferSize的一半)  // 参考文章《RunTime.getRunTime().addShutdownHook用法》Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {if (cb.length() > 0) {sendBuffer();}}});}@Overridepublic void append(LoggingEvent event) {if (!(checkEntryConditions())) {return;}event.getThreadName();event.getNDC();event.getMDCCopy();if (this.getLocationInfo()) {event.getLocationInformation();}cb.add(event);// 事件的个数达到bufferSize的一半的时候就会发一封邮件if (this.evaluator.isTriggeringEvent(event)) {if (cb.length() >= this.getBufferSize() / 2) {sendBuffer();}}}}
log4j.appender.MAIL=com.snail.base.log.DefineSMTPAppender

上面的功能都已测试通过,下面的功能没有做过测试。

4) 修改Log4j的SMTP默认级别

Log4j的SMTP的级别默认是ERROR级别,只有logger.error("");,才可以收到邮件。不过可以自定义的级别,继承TriggeringEventEvaluator类,覆盖里面的一个方法: 

public boolean isTriggeringEvent(LoggingEvent arg0) {return arg0.getLevel().isGreaterOrEqual(Level.INFO);}

3. 邮件样式

Log session start time Wed Apr 23 14:08:22 CST 2014

Time

Thread

Level

Category

Message

5733

main

ERROR

com.wyy.snail.user.test.Log4jSendMail

i:4 Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。

参考文章

《Log4j基本使用方法》

《eclipse package,source folder,folder区别及相互转换》

《RunTime.getRunTime().addShutdownHook用法》



来自:http://blog.csdn.net/yin_jw/article/details/24385077

0 0
原创粉丝点击