Log4j发送日志邮件的作用:项目错误信息能及时(实时)反映给项目维护人员以及相关负责人。
补充:发送邮件的一个重要的类是SMTPAppender,版本低于log4j-1.2.14.jar不支持SMTP认证(SMTPAppender中没有SMTPPassword 和SMTPUsername 属性,这两个属性分别是登录SMTP服务器发送认证的用户名和密码)。
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>
log4j.rootLogger=info,console,MAIL
log4j.logger.org.apache.mina.filter.logging.LoggingFilter=WARN
log4j.logger.com.playsnail.core.web.filter.IdentityFilter=WARN
log4j.logger.com.d1xn.common.log.Log=WARN
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p-%d{yyyy/MM/dd/HH\:mm\:ss}]%c{1}.(%L) - %m%n
log4j.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("***")方法,才能发送邮件。
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.com
appender.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();
}
}
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?");
}
}
}
log4j.rootLogger=info,console,MAIL
需要加上MAIL,否则不会调用邮件发送类,发送邮件
自定义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
另外一个问题也随之产生了,当程序结束时,还在缓冲里面的事件是不会被发送出来的,因为事件数往往没有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() {
@Override
public void run() {
if (cb.length() > 0) {
sendBuffer();
}
}
});
}
@Override
public 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
上面的功能都已测试通过,下面的功能没有做过测试。
Log4j的SMTP的级别默认是ERROR级别,只有logger.error("");,才可以收到邮件。不过可以自定义的级别,继承TriggeringEventEvaluator类,覆盖里面的一个方法:
public boolean isTriggeringEvent(LoggingEvent arg0) {
return arg0.getLevel().isGreaterOrEqual(Level.INFO);
}
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用法》