日记工具类V2.0

日志工具类V2.0

这里用的是Log4j-1.2.17


相对于日志工具类V1.0而言,2.0新增日志的数据库保存和邮件发送功能



下面是具体的日志工具类

package com.jadyer.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 日志工具类
 * @see ===============================================================================================================
 * @see 【用法如下】
 * @see 说明:在想要记录日志的位置,执行LogUtil.setXxxLogger(),然后就可以LogUtil.getLogger().info("....")
 * @see 举例:假设一个SSH2工程中有个名为userLogin()的Action方法,其内部调用了UserService,UserService内部又调用了UserDAO
 * @see      我们在userLogin()、UserService、UserDAO中均使用了LogUtil.getLogger().info("....")记录相应的日志信息
 * @see      这时,我们的日志信息,会被自动记录到ecpaycus-default.log文件中
 * @see      同理,我们若在userLogin()方法的第一句话执行LogUtil.setWebCusLogger()
 * @see           则日志会被自动写入ecpaycus-webcus.log文件中,而不会写入到ecpaycus-default.log中了
 * @see ===============================================================================================================
 * @author  玄玉<http://blog.csdn.net/jadyer>
 * @version v2.0
 * @history v2.0:新增日志的数据库保存和邮件发送功能
 * @history v2.0:这是v1.0的博文地址==>http://blog.csdn.net/jadyer/article/details/7616031
 * @editime Aug 5, 2012 6:59:38 PM
 * @created Dec 27, 2011 12:03:01 PM
 */
public class LogUtil {
	//自定义线程范围内共享的对象。即它会针对不同线程分别创建独立的对象
	//此时每个线程得到的将是自己的实例,各线程间得到的实例没有任何关联
	private static ThreadLocal<Log> currentLoggerMap = new ThreadLocal<Log>();
	
	/**默认日志记录器*/
	private static Log defaultLogger = LogFactory.getLog("defaultLogger");
	/**数据库存储记录器*/
	private static Log databaseLogger = LogFactory.getLog("databaseLogger");
	/**Web定制日志记录器*/
	private static Log webCusLogger = LogFactory.getLog("ecpaycusWebCusLogger");
	/**对账文件日志记录器*/
	private static Log recFileLogger = LogFactory.getLog("ecpaycusRecFileLogger");
	
	private LogUtil(){}

	/**
	 * 获取当前线程中的日志记录器
	 * @see 每个线程调用全局的ThreadLocal.set()方法
	 * @see 相当于在其内部的Map中增加一条记录,key是各自的线程,value是各自set()的值
	 * @see 取的时候,直接ThreadLocal.get()即可。。。。。。。。。。。至于其内部实现,你懂的
	 * @see 我博客里对此有记载==>>http://blog.csdn.net/jadyer/article/details/7338071
	 * @see Struts2就是这么做的,请见com.opensymphony.xwork2.ActionContex第43和166行源码
	 */
	public static Log getLogger() {
		Log log = currentLoggerMap.get();
		if(null == log){
			return defaultLogger;
		}else{
			return log;
		}
	}
	
	/**
	 * 数据库存储记录器
	 */
	public static void setDatabaseLogger(){
		currentLoggerMap.set(databaseLogger);
	}
	
	/**
	 * Web定制日志记录器
	 */
	public static void setWebCusLogger(){
		currentLoggerMap.set(webCusLogger);
	}
	
	/**
	 * 对账文件日志记录器
	 */
	public static void setRecFileLogger(){
		currentLoggerMap.set(recFileLogger);
	}
}

下面是log4j.properties

#use Root for GobalConfig
log4j.rootLogger=DEBUG,CONSOLE,EMAILSEND
log4j.logger.defaultLogger=DEBUG,DEFAULT_LOG
log4j.logger.databaseLogger=DEBUG,DATABASE_LOG
log4j.logger.ecpaycusWebCusLogger=DEBUG,ECPAYCUS_WEBCUS_LOG
log4j.logger.ecpaycusRecFileLogger=DEBUG,ECPAYCUS_RECFILE_LOG
log4j.additivity.defaultLogger=true
log4j.additivity.databaseLogger=true
log4j.additivity.ecpaycusWebCusLogger=true
log4j.additivity.ecpaycusRecFileLogger=true


#use ConsoleAppender for ConsoleOut
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n


#use SMTPAppender for EmailSend
log4j.appender.EMAILSEND=org.apache.log4j.net.SMTPAppender
log4j.appender.EMAILSEND.SMTPDebug=false
log4j.appender.EMAILSEND.Threshold=ERROR
log4j.appender.EMAILSEND.BufferSize=10
log4j.appender.EMAILSEND.SMTPHost=smtp.yeah.net
log4j.appender.EMAILSEND.SMTPUsername=jadyer
log4j.appender.EMAILSEND.SMTPPassword=jady*****er
log4j.appender.EMAILSEND.From=jadyer@yeah.net
log4j.appender.EMAILSEND.To=log4j001@yeah.net,log4j002@yeah.net,log4j003@yeah.net
log4j.appender.EMAILSEND.Cc=log4j004@yeah.net
log4j.appender.EMAILSEND.Bcc=log4j005@yeah.net
log4j.appender.EMAILSEND.Subject=\u3010\u63d0\u9192\u3011\u4ea4\u6613\u524d\u7f6e\u7cfb\u7edf\u9047\u5230\u5f02\u5e38
log4j.appender.EMAILSEND.layout=org.apache.log4j.PatternLayout
log4j.appender.EMAILSEND.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n


#use DailyRollingFileAppender for DefauleLogFile
log4j.appender.DEFAULT_LOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEFAULT_LOG.File=../logs/default.log
log4j.appender.DEFAULT_LOG.encoding=UTF-8
log4j.appender.DEFAULT_LOG.Threshold=DEBUG
log4j.appender.DEFAULT_LOG.DatePattern='.'yyyyMMdd
log4j.appender.DEFAULT_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEFAULT_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n


#user JDBCAppender for DataBaseSaved
log4j.appender.DATABASE_LOG=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE_LOG.URL=jdbc:mysql://127.0.0.1:3306/jadyer?characterEncoding=UTF-8
log4j.appender.DATABASE_LOG.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE_LOG.user=root
log4j.appender.DATABASE_LOG.password=jadyer
log4j.appender.DATABASE_LOG.sql=insert into OPERATE_LOG(message) values ('[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n')
log4j.appender.DATABASE_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n


#use DailyRollingFileAppender for WebCusLogFile
log4j.appender.ECPAYCUS_WEBCUS_LOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ECPAYCUS_WEBCUS_LOG.File=../logs/ecpaycus-webcus.log
log4j.appender.ECPAYCUS_WEBCUS_LOG.encoding=UTF-8
log4j.appender.ECPAYCUS_WEBCUS_LOG.Threshold=DEBUG
log4j.appender.ECPAYCUS_WEBCUS_LOG.DatePattern='.'yyyyMMdd
log4j.appender.ECPAYCUS_WEBCUS_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.ECPAYCUS_WEBCUS_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n


#use DailyRollingFileAppender for ReconciliationFile
log4j.appender.ECPAYCUS_RECFILE_LOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ECPAYCUS_RECFILE_LOG.File=../logs/ecpaycus-recfile.log
log4j.appender.ECPAYCUS_RECFILE_LOG.encoding=UTF-8
log4j.appender.ECPAYCUS_RECFILE_LOG.Threshold=DEBUG
log4j.appender.ECPAYCUS_RECFILE_LOG.DatePattern='.'yyyyMMdd
log4j.appender.ECPAYCUS_RECFILE_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.ECPAYCUS_RECFILE_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n

最后是短信发送的测试类

package com.jadyer.demo;

import java.io.IOException;

import com.jadyer.util.LogUtil;

/**
 * 测试:通过Log4j将日志发到邮箱中
 * @see =======================================================================================================
 * @see 注意:log4j-1.2.14之后才支持SMTP认证,否则会报告异常....我这里用的是最新的log4j-1.2.17.jar
 * @see =======================================================================================================
 * @see 另外,看到网上很多人说发出去的邮件,如果主题和正文有中文的话,对方收到的将是乱码
 * @see 不过很奇怪,我这里发出去的主题和正文都是中文的,结果对方收到的邮件中全都没有乱码
 * @see =======================================================================================================
 * @see 程序运行时,需导入mail.jar(可通过Oracle官网下载javamail-1.4.5.zip取得)....另外,程序也可能报告下面的异常
 * @see Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
 * @see 这是由于MyEclipse6.5自带的javaee.jar中的mail包,与,我们导入的mail.jar冲突
 * @see 解决办法就是:在myeclipse安装目录下找到javaee.jar,用WinRAR打开,删除里面的mail文件夹,即可
 * @see ..\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5\javaee.jar
 * @see =======================================================================================================
 * @see 这里用到的smtp.yeah.net属于第三方的SMTP服务,我们也可以在本机上装一个SMTP服务,比如IMail、Postfix等
 * @see 另外,Unix和Linux一般都会默认开启SMTP服务的,我们可以在Linux上执行该命令查看:telnet 127.0.0.1 25
 * @see [wzf@bjgg-kfvm-31 ~]$ telnet 127.0.0.1 25
 * @see Trying 127.0.0.1...
 * @see Connected to localhost.localdomain (127.0.0.1).
 * @see Escape character is '^]'.
 * @see 220 bjgg-kfvm-31.localdomain ESMTP Postfix
 * @see 这就表示其已经开启了SMTP服务了,不过若看到类似下面的字样,则表示其没有开启SMTP服务
 * @see 正在连接到127.0.0.1...无法打开到主机的连接 在端口 25 : 连接失败
 * @see =======================================================================================================
 * @see 另外,关于如何通过Java手工发送邮件,以及发送带有附件的邮件,可以参考我的三篇博文
 * @see 邮件发送程序V1.0==>http://blog.csdn.net/jadyer/article/details/6130088
 * @see 邮件发送程序V2.0==>http://blog.csdn.net/jadyer/article/details/6130105
 * @see 邮件发送程序V3.0==>http://blog.csdn.net/jadyer/article/details/6130131
 * @see =======================================================================================================
 * @author 玄玉<http://blog.csdn/net/jadyer>
 * @create Aug 5, 2012 1:09:50 AM
 */
public class EmailSendTest {
	public static void main(String[] args) {
		LogUtil.setWebCusLogger();
		LogUtil.getLogger().info("这是一则普通的程序日志11....");
		LogUtil.getLogger().info("这是一则普通的程序日志22....");
		LogUtil.getLogger().error("这是一个错误消息");
		LogUtil.getLogger().error("错误提示信息如下:", new IOException("ioex"));
		LogUtil.getLogger().info("这是一则普通的程序日志33....");
		LogUtil.getLogger().info("这是一则普通的程序日志44....");
	}
}