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
- Log4j-自动发送日志邮件
- Log4j 自动发送日志邮件
- log4j自动发送错误日志邮件
- log4j发送日志邮件
- Log4J使用实例---日志进行邮件发送或是存入数据库
- Log4j学习笔记-日志分等级输出,发送邮件,插入数据库
- log4j 邮件发送
- 在Log4j中实现日志的Email自动发送
- 安装exitmail的日志系统,并自动发送邮件过来
- Java Web - 日志-log4j(二)-- 将日志发送到邮件
- 关于log4j.xml发送邮件
- 自动发送邮件
- 自动发送邮件
- 如何自动发送邮件
- SVN 邮件自动发送
- C#自动发送邮件
- 自动发送邮件方法
- 邮箱自动发送邮件
- hdu1.3.5 排列2
- 层次遍历变种103. Binary Tree Zigzag Level Order Traversal
- mybatis学习总结-mybatis初体验
- 智能指针之auto_ptr源码剖析
- [转载]Spring read-only="true" 只读事务的一些概念
- Log4j 自动发送日志邮件
- 当神仙面对失败
- POJ 1006(中国剩余定理)
- hdu 5113 Black And White(dfs+剪枝)
- Canada Cup 2016 E
- 编译64位dcmtk库
- unity界面的学习
- Android上定义一个懒人专用的log
- linux_Gdb list使用介绍 :