当前位置: 首页 > 工具软件 > cb4j > 使用案例 >

Log4j-自动发送日志邮件

衡丰茂
2023-12-01

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,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("***")方法,才能发送邮件。

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.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();
	}
}

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() {
			@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

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

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用法》



 类似资料: