日誌工具類v2.1

來源:互聯網
上載者:User

這裡用的是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),其用法如下 * @see LogUtil.setCurrentLogger((Log)session.getAttribute("currentLog")) * @see LogUtil.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);}}

下面是log4j.properties

#use Root for GobalConfiglog4j.rootLogger=DEBUG,CONSOLE,EMAILSENDlog4j.logger.defaultLogger=DEBUG,DEFAULT_LOGlog4j.logger.databaseLogger=DEBUG,DATABASE_LOGlog4j.logger.ecpaycusWebCusLogger=DEBUG,ECPAYCUS_WEBCUS_LOGlog4j.logger.ecpaycusRecFileLogger=DEBUG,ECPAYCUS_RECFILE_LOGlog4j.additivity.defaultLogger=truelog4j.additivity.databaseLogger=truelog4j.additivity.ecpaycusWebCusLogger=truelog4j.additivity.ecpaycusRecFileLogger=true#use ConsoleAppender for ConsoleOutlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=DEBUGlog4j.appender.CONSOLE.Target=System.outlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n#use SMTPAppender for EmailSendlog4j.appender.EMAILSEND=org.apache.log4j.net.SMTPAppenderlog4j.appender.EMAILSEND.SMTPDebug=falselog4j.appender.EMAILSEND.Threshold=ERRORlog4j.appender.EMAILSEND.BufferSize=10log4j.appender.EMAILSEND.SMTPHost=smtp.yeah.netlog4j.appender.EMAILSEND.SMTPUsername=jadyerlog4j.appender.EMAILSEND.SMTPPassword=jady*****erlog4j.appender.EMAILSEND.From=jadyer@yeah.netlog4j.appender.EMAILSEND.To=log4j001@yeah.net,log4j002@yeah.net,log4j003@yeah.netlog4j.appender.EMAILSEND.Cc=log4j004@yeah.netlog4j.appender.EMAILSEND.Bcc=log4j005@yeah.netlog4j.appender.EMAILSEND.Subject=\u3010\u63d0\u9192\u3011\u4ea4\u6613\u524d\u7f6e\u7cfb\u7edf\u9047\u5230\u5f02\u5e38log4j.appender.EMAILSEND.layout=org.apache.log4j.PatternLayoutlog4j.appender.EMAILSEND.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n#use DailyRollingFileAppender for DefauleLogFilelog4j.appender.DEFAULT_LOG=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.DEFAULT_LOG.File=../logs/default.loglog4j.appender.DEFAULT_LOG.encoding=UTF-8log4j.appender.DEFAULT_LOG.Threshold=DEBUGlog4j.appender.DEFAULT_LOG.DatePattern='.'yyyyMMddlog4j.appender.DEFAULT_LOG.layout=org.apache.log4j.PatternLayoutlog4j.appender.DEFAULT_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n#user JDBCAppender for DataBaseSavedlog4j.appender.DATABASE_LOG=org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.DATABASE_LOG.URL=jdbc:mysql://127.0.0.1:3306/jadyer?characterEncoding=UTF-8log4j.appender.DATABASE_LOG.driver=com.mysql.jdbc.Driverlog4j.appender.DATABASE_LOG.user=rootlog4j.appender.DATABASE_LOG.password=jadyerlog4j.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.PatternLayoutlog4j.appender.DATABASE_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n#use DailyRollingFileAppender for WebCusLogFilelog4j.appender.ECPAYCUS_WEBCUS_LOG=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.ECPAYCUS_WEBCUS_LOG.File=../logs/ecpaycus-webcus.loglog4j.appender.ECPAYCUS_WEBCUS_LOG.encoding=UTF-8log4j.appender.ECPAYCUS_WEBCUS_LOG.Threshold=DEBUGlog4j.appender.ECPAYCUS_WEBCUS_LOG.DatePattern='.'yyyyMMddlog4j.appender.ECPAYCUS_WEBCUS_LOG.layout=org.apache.log4j.PatternLayoutlog4j.appender.ECPAYCUS_WEBCUS_LOG.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss}][%t][%C{1}.%M]%m%n#use DailyRollingFileAppender for ReconciliationFilelog4j.appender.ECPAYCUS_RECFILE_LOG=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.ECPAYCUS_RECFILE_LOG.File=../logs/ecpaycus-recfile.loglog4j.appender.ECPAYCUS_RECFILE_LOG.encoding=UTF-8log4j.appender.ECPAYCUS_RECFILE_LOG.Threshold=DEBUGlog4j.appender.ECPAYCUS_RECFILE_LOG.DatePattern='.'yyyyMMddlog4j.appender.ECPAYCUS_RECFILE_LOG.layout=org.apache.log4j.PatternLayoutlog4j.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....");}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.