这里用的是Log4j-1.2.17
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.1 * @history v2.0:新增日志的数据库保存和邮件发送功能 * @history v2.1:新增多线程情景下的日志集中打印功能 * @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; } } /** * 设置日志记录器为当前会话时最初绑定的日志记录器 * @see 该方法适用于整个会话由2个或2个以上的线程处理的情景 * @see 比如Mina2.x中的exceptionCaught(IoSession session, Throwable cause),其用法如下 * @seeLogUtil.setCurrentLogger((Log)session.getAttribute("currentLog"))
* @seeLogUtil.getLogger().error("请求被拒绝or请求地址有误,堆栈信息如下", cause)
* @see 最后,记得会话开始时,通过session.setAttribute("currentLog", LogUtil.getLogger())
标记日志记录器 */ public static void setCurrentLogger(Log log){ currentLoggerMap.set(log); } /** * 多线程情境下若想使用defaultLogger则最好在使用前调用一次该方法 */ public static void setDefaultLogger(){ currentLoggerMap.set(defaultLogger); } /** * 数据库存储记录器 */ public static void setDatabaseLogger(){ currentLoggerMap.set(databaseLogger); } /** * Web定制日志记录器 */ public static void setWebCusLogger(){ currentLoggerMap.set(webCusLogger); } /** * 对账文件日志记录器 */ public static void setRecFileLogger(){ currentLoggerMap.set(recFileLogger); } }
#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 [email protected] [email protected],[email protected],[email protected] [email protected] [email protected] 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...."); } }