內(nèi)蒙古java團(tuán)隊

          j2se,j2ee開發(fā)組
          posts - 139, comments - 212, trackbacks - 0, articles - 65
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          基于Log4j靈活編寫日志類

          Posted on 2006-12-18 08:59 帥子 閱讀(2605) 評論(5)  編輯  收藏 所屬分類: j2se技術(shù)專區(qū)
          在進(jìn)行代碼開發(fā)的過程中,日志是非常重要的。如果沒有日志是難以進(jìn)行代碼調(diào)試和排錯的。
          在開發(fā)過程中,我們可以選擇適合自己(團(tuán)隊)的日志類來實現(xiàn)日志輸出,也可以自己編寫日志類來實現(xiàn)(也是有一定工作量的,不推薦),當(dāng)然也可以選擇第三方的日志類來輔助,比如Log4j等。如果開發(fā)環(huán)境是JDK1.4以上的話,可以利用JDK自帶的日志類java.util.logging,也可以使用第三方的日志類;如果開發(fā)環(huán)境是JDK1.3,那就只能使用第三方的日志類,或者自行編寫日志類。
          本文主要介紹如何在Log4j的基礎(chǔ)上,實現(xiàn)符合自己需要的日志類。
          Log4j功能相當(dāng)完善,一般都通過腳本配置將日志按照一定的規(guī)則輸出到文件或者console上,這種做法還是比較靈活的。
          但現(xiàn)在需求比較特殊:
          1、不想把日志輸出到一個確定的文件中,而希望是哪個類的日志就輸出到以這個類命名的文件中(通過腳本較難實現(xiàn),如何您能實現(xiàn)的話,請一定要告訴我,呵呵);
          2、每天的日志放在以日期命名的文件夾中,比如今天是2006-12-15,那么日志所在的文件夾是061215;
          3、對于每天的日志采用循環(huán)日志,日志文件最大大小為2M,超過2M就清空重寫(這個功能Log4j本身是可以實現(xiàn)的);
          4、日志輸出應(yīng)包含時間(這個功能Log4j本身也是可以實現(xiàn)的)。

          下面是自行編寫的LogBase類,文件名為:LogBase.java
          ------------------------------------------------------------------------------------------------
          import?java.io.File;
          import?java.text.SimpleDateFormat;
          import?java.util.Date;
          import?java.util.ResourceBundle;

          import?org.apache.log4j.Level;
          import?org.apache.log4j.Logger;
          import?org.apache.log4j.PatternLayout;
          import?org.apache.log4j.RollingFileAppender;

          public?class?LogBase?{
          ????private?static?String?PROPERTIES_FILE?=?"logconf";

          ????private?static?String?LOG_PATH;

          ????private?static?String?DATE_LOG_FOLDER;

          ????private?static?String?LOG_LEVEL;

          ????private?static?String?PATTERN_LAYOUT;

          ????private?static?long?MAX_FILE_SIZE;

          ????private?LogBase()?{
          ????}

          ????public?static?Logger?getLogInstance(String?name)?{
          ????????Logger?logger?=?Logger.getLogger(name);
          ????????try?{
          ????????????String?pattern?=?getPatternLayout();
          ????????????RollingFileAppender?appender?=?new?RollingFileAppender(
          ????????????????????new?PatternLayout(pattern),?createClassLogFile(name)
          ????????????????????????????.getAbsolutePath());
          ????????????long?maxfilesize?=?getMaxFileSize();
          ????????????appender.setMaximumFileSize(maxfilesize);
          ????????????logger.addAppender(appender);
          ????????????String?level?=?getLogLevel();
          ????????????logger.setLevel((Level)?Level.toLevel(level));
          ????????}?catch?(Exception?e)?{
          ????????????e.printStackTrace();
          ????????}

          ????????return?logger;
          ????}

          ????/*
          ?????*?在LOG_PATH下創(chuàng)建以當(dāng)天日期為名字的文件夾
          ?????*/
          ????private?static?File?createDateLogFolder()?{
          ????????LOG_PATH?=?getLogPath();
          ????????if?(LOG_PATH?==?null)?{
          ????????????readLogConfigParams();
          ????????}

          ????????String?currentdate?=?getCurrentDate();
          ????????DATE_LOG_FOLDER?=?LOG_PATH?+?System.getProperty("file.separator")
          ????????????????+?currentdate;

          ????????File?logFolder?=?new?File(DATE_LOG_FOLDER);
          ????????try?{
          ????????????if?(!logFolder.exists())?{
          ????????????????logFolder.mkdirs();
          ????????????}
          ????????}?catch?(Exception?ex)?{
          ????????????ex.printStackTrace();
          ????????}

          ????????return?logFolder;
          ????}

          ????private?static?File?createClassLogFile(String?classname)?{
          ????????if?(DATE_LOG_FOLDER?==?null)?{
          ????????????createDateLogFolder();
          ????????}

          ????????String?classnameString?=?DATE_LOG_FOLDER
          ????????????????+?System.getProperty("file.separator")?+?classname?+?".txt";
          ????????File?logFile?=?new?File(classnameString);
          ????????try?{
          ????????????if?(!logFile.exists())?{
          ????????????????logFile.createNewFile();
          ????????????}
          ????????}?catch?(Exception?ex)?{
          ????????????ex.printStackTrace();
          ????????}
          ????????return?logFile;
          ????}

          ????private?static?void?readLogConfigParams()?{
          ????????ResourceBundle?rb?=?ResourceBundle.getBundle(PROPERTIES_FILE);
          ????????LOG_PATH?=?rb.getString("LOG_PATH");
          ????????LOG_LEVEL?=?rb.getString("LOG_LEVEL");
          ????????PATTERN_LAYOUT?=?rb.getString("PATTERN_LAYOUT");
          ????????MAX_FILE_SIZE?=?Long.parseLong(rb.getString("MAX_FILE_SIZE"));
          ????}

          ????private?static?String?getLogPath()?{
          ????????return?LOG_PATH;
          ????}

          ????private?static?String?getCurrentDate()?{
          ????????SimpleDateFormat?df?=?new?SimpleDateFormat("yyyyMMdd");
          ????????return?df.format(new?Date());
          ????}

          ????private?static?String?getLogLevel()?{
          ????????if?(LOG_LEVEL?==?null)?{
          ????????????readLogConfigParams();
          ????????}
          ????????return?LOG_LEVEL;
          ????}

          ????private?static?String?getPatternLayout()?{
          ????????if?(PATTERN_LAYOUT?==?null)?{
          ????????????readLogConfigParams();
          ????????}
          ????????return?PATTERN_LAYOUT;
          ????}

          ????private?static?long?getMaxFileSize()?{
          ????????if?(!(MAX_FILE_SIZE?>?0))?{
          ????????????readLogConfigParams();
          ????????}
          ????????return?MAX_FILE_SIZE;
          ????}

          ????public?static?void?main(String[]?args)?{
          ????????Logger?logger?=?LogBase.getLogInstance("LogBase");
          ????????logger.info("info");
          ????????logger.error("error");
          ????}
          }
          ------------------------------------------------------------------------------------------------
          LogBase類從配置文件logconf.properties文件中讀入日志存放路徑,logconf.properties文件內(nèi)容很簡單,如下:
          ------------------------------------------------------------------------------------------------
          LOG_PATH?=?D:\\logs
          LOG_LEVEL?=?Level.DEBUG
          PATTERN_LAYOUT?=?%-5p?%d{yyyy-MM-dd?HH:mm:ss}?%m%n
          #MaxFileSize?is?set?to?about?10M
          MAX_FILE_SIZE?=?10485760
          ------------------------------------------------------------------------------------------------
          注意,LogBase類對外只提供一個public類型的方法getLogInstance(String?name),其余類都是private類型的。getLogInstance方法返回的類型是Logger,在getLogInstance方法中通過addAppender指向一個RollingFileAppender類型的文件,并設(shè)置日志文件的最大大小,然后通過setLevel方法設(shè)置日志級別。LOG_LEVEL,PATTERN_LAYOUT和MAX_FILE_SIZE都從配置文件中取得。
          寫好這個類后,當(dāng)需要使用LogBase類的時候,只要在你的源程序中加入:private?static?Logger?logger?=?LogBase.getLogInstance("XXXXXX");
          XXXXXX代表你的類名,然后通過logger.info()之類的進(jìn)行寫日志就可以了。
          例如下面的測試
          ------------------------------------------------------------------------------------------------
          import?org.apache.log4j.Logger;

          public?class?LogBaseTest?{
          ????private?static?Logger?logger?=?LogBase.getLogInstance("LogBaseTest");

          ????public?static?void?main(String[]?args)?{
          ????????logger.info("LogBaseTest");
          ????}

          }
          ------------------------------------------------------------------------------------------------
          運行結(jié)束后,請到日志路徑下查找,是否出現(xiàn)以今天日期為名字的文件夾,并檢查該文件夾里面是否有一個LogBaseTest.txt文件,看看文件里的內(nèi)容是什么樣子的,日志格式應(yīng)該如下:
          INFO??2006-12-15?13:33:36?LogBaseTest

          以上的源程序和配置文件,請下載附件。
          如果讀者對以上的內(nèi)容有任何疑問,可以和我聯(lián)系,jw_ws@163.com?版權(quán)所有,嚴(yán)禁轉(zhuǎn)載

          評論

          # re: 基于Log4j靈活編寫日志類  回復(fù)  更多評論   

          2007-07-23 11:16 by 輪子是圓的
          重新發(fā)明輪子...多余

          # re: 基于Log4j靈活編寫日志類[未登錄]  回復(fù)  更多評論   

          2007-08-12 10:58 by z
          怎么沒有附件啊?。。。。。。。。。。。。。。。?!

          # re: 基于Log4j靈活編寫日志類[未登錄]  回復(fù)  更多評論   

          2009-10-01 00:57 by jake
          謝謝分享,很經(jīng)典!收藏了

          # re: 基于Log4j靈活編寫日志類[未登錄]  回復(fù)  更多評論   

          2009-11-22 15:30 by cz
          hao

          # re: 基于Log4j靈活編寫日志類  回復(fù)  更多評論   

          2013-11-22 10:15 by 拆了你的輪子
          @輪子是圓的
          你的話,多余……
          主站蜘蛛池模板: 宜州市| 万源市| 盐山县| 克东县| 丰顺县| 宕昌县| 东城区| 石城县| 霍邱县| 汾西县| 视频| 琼中| 宝丰县| 浮山县| 荆州市| 普兰店市| 崇礼县| 揭西县| 甘肃省| 金寨县| 铜梁县| 固阳县| 高青县| 兴宁市| 开远市| 长白| 凤山市| 武邑县| 多伦县| 成安县| 奉化市| 苍山县| 彭州市| 长沙市| 新野县| 樟树市| 平泉县| 留坝县| 汕尾市| 阿荣旗| 宜君县|