Log4j和common-logging的使用

 Log4j和common-logging的使用
Log4j和common-logging都是apache下的開源項目,他們的區別和簡單使用請參考以下網址。
這是篇非常好的文章,我只想給他做一下補充。
 
補充一:
大家可以看到不管是log4j還是commons-logging,在程序中使用時都需要以下步驟:
1.       初始化,生成靜態實例:
commons-logging中是: private   static  Log log  =  LogFactory.getLog(TestLog. class );   
log4j中是:static  Logger logger  =  Logger.getLogger(TestLog4j. class );  
PropertyConfigurator.configure( " log4j.properties " );  
第二句可以省略,缺省情況下,他會自己找到 log4j.properties
2. 在程序中使用:
logger.debug( " Here is some DEBUG " ); 
logger.info( " Here is some INFO " );   
logger.warn( " Here is some WARN " );   
如果這樣做,會在每個程序中生成一個靜態實例,如果是比較大的項目,這樣做是不妥的。
我們可以在整個應用程序中生成一個實例,也就是初始化一次,在整個應用程序中都使用這個實例。
比如,我們寫一個日誌初始化類,如下:
package myb.hi.core.log;
 
import org.apache.commons.logging.*;
 
public class Logs {
       private static Log log;
       /**
        * Define a static Log variable,
        */  
              static{
                     try{
                            log=LogFactory.getLog(Logs.class);
                     }catch(Exception ex){
                            System.out.println("can't init the Logger, caused by: "+ex);
                     }
              }
      
       /**
        * Get the log object
        * @return Log
        */
       public static Log getLogger(){
              return log;
       }
}
上面代碼使用commons-logging生成一個靜態log實例,以後的程序就可以這樣來做:
Logs.getLogger().info("begin Action: UserBaseInfoAction.getSingleUserInfo()");
DBSession.begin();
String fname=userForm.getFname();
userForm=UserBaseInfoBusiness.getSingleUserInfo(DBSession.getSession(),fname);
DBSession.commit();
request.setAttribute("userInfo",userForm);
Logs.getLogger().info("end Action: UserBaseInfoAction.getSingleUserInfo()");
 
在需要做記錄的地方使用Logs.getLogger()獲得這個log實例,然後再調用他的方法(info,debug,error等)。
 
Log4j的實現方法類似,初始化類可以這樣寫:
package myb.hi.core.log;
 
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
 
public class Logs {
       private static Logger log logger;
       /**
        * Define a static Log variable,
        */  
              static{
                     try{
                            logger=Logger.getLogger(LogInit.class);     
                            //DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加載.xml文件
                          //PropertyConfigurator.configure("log4j.properties");//加載.properties文件                    }catch(Exception ex){
                            System.out.println("can't init the Logger, caused by: "+ex);
                     }
              }
      
       /**
        * Get the log object
        * @return Log
        */
       public static Logger getLogger(){
              return logger;
       }
}
應用程序中的調用是完全相同的。
補充二:
log4j.properties文件中,logger定義的日誌級別可以和appender的不一樣。
在定義logger時,儘量把日誌級別往低裏寫;在appender裏定義日誌級別時可以按需要來寫。
比如,定義一個logger,
log4j.rootLogger = DEBUG, CONSOLE,A1
定義成DEBUG,不管appender怎麼定義,肯定有輸出。
如果定義成:
log4j.rootLogger = INFO, CONSOLE,A1
定義成INFO,appender的定義必須級別必須比他高才行,如果appender定義成DEBUG,將不會輸出。
 
同樣的,在程序中調用logger時,調用的方法級別也必須要比logger定義的級別高,纔有輸出。
比如,log4j.rootLogger = INFO, CONSOLE,A1
定義成INFO,程序中,Logs.getLogger().info()方法是可以有輸出的;Logs.getLogger().debug()方法將不會有任何輸出。
 
補充三:
有關日誌文件輸出路徑。
如果不指定路徑,日誌文件是輸出在運行目錄的,也就是應用服務器的bin目錄下,
比如下面:
log4j.appender.A1.File = SampleMessages.log4j
假設應用服務器用的是tomcat,那麼SampleMessages.log4j文件會在tomcat安裝目錄的bin子目錄下。
爲了把日誌文件統一存放,請使用絕對路徑或相對路徑,比如下面:
log4j.appender.A1.File = ../logs/SampleMessages.log4j
這樣日誌文件將放在tomcat的logs目錄內。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章