hgc-ghc
          Good Good Study!!! Day Day Up!!!
          posts - 40,comments - 3,trackbacks - 0

          1.      介紹

          1.1.      Log4j 是什么?

          Log4jApache的一個(gè)開放源代碼項(xiàng)目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,能夠更加細(xì)致地控制日志的生成過程,而這些可以通過一個(gè)配置文件來靈活地進(jìn)行配置,不需要修改應(yīng)用的代碼。

          1.2.      構(gòu)成Log4j三大類組件

          (1) Logger : 負(fù)責(zé)輸出信息日志信息,并能夠?qū)θ罩拘畔⑦^濾,確定哪些日志信息輸出,哪些信息被忽略。

          (2) Appender : 指定日志輸出到什么地方,可以是控制臺、文件或網(wǎng)絡(luò)設(shè)備等等。

          (3) Layouts : 加在Appender后面用以實(shí)現(xiàn)格式化輸出日志的內(nèi)容。

          2. Log4j的設(shè)置

          第一步:加入log4jjarlib下。

          第二步:在CLASSPATH下建立log4j.properties或XML格式的配置文件。

          第三步:導(dǎo)入所有需的commongs-logging類:
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;

          第四步:在自己的類中定義一個(gè)org.apache.commons.logging.Log類的私有靜態(tài)類成員:
          private final Log log = LogFactory.getLog(getClass());
          LogFactory.getLog()
          方法的參數(shù)使用的是當(dāng)前類的class

          步:使用org.apache.commons.logging.Log類的成員方法輸出日志信息:

          例如:if (log.isDebugEnabled())
          {log.debug("Test log4j!");}

          3. Log4j的配置文件

          3.1 Log4j輸出日志信息的優(yōu)先級

          Log4j輸出日志信息的級別OFFFATALERRORWARNINFODEBUGALL或者自定義的級別。Log4j建議只使用四個(gè)級別,優(yōu)先級從高到低分別是ERRORWARNINFODEBUG。通過在這里定義的級別,可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。比如在這里定義了INFO級別,只有等于及高于這個(gè)級別的才進(jìn)行處理,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關(guān)閉所有的日志輸出。

          3.2 Log4j配置文件的詳細(xì)介紹

          Log4j支持兩種配置文件格,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:

          ①、              配置根Logger
          Logger 
          負(fù)責(zé)處理日志記錄的大部分操作。 
          其語法為:
          log4j.rootLogger = [ level ] , appenderName, appenderName, …
          其中,level 是日志記錄的優(yōu)先級

          ②、              配置日志信息輸出目的地 Appender
          Appender 
          負(fù)責(zé)控制日志記錄操作的輸出。 
          其語法為:
          log4j.appender.appenderName = fully.qualified.name.of.appender.class 
          log4j.appender.appenderName.option1 = value1 
          … 
          log4j.appender.appenderName.optionN = valueN 
          這里的appenderName為在①里定義的,可任意起名。
          其中,Log4j提供的appender有以下幾種: 
          org.apache.log4j.ConsoleAppender
          (控制臺), 
          org.apache.log4j.FileAppender
          (文件), 
          org.apache.log4j.DailyRollingFileAppender
          (每天產(chǎn)生一個(gè)日志文件),
          org.apache.log4j.RollingFileAppender
          (文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),可通過log4j.appender.R.MaxFileSize=100KB設(shè)置文件大小,還可通過log4j.appender.R.MaxBackupIndex=1設(shè)置為保存一個(gè)備份文件。 
          org.apache.log4j.WriterAppender
          (將日志信息以流格式發(fā)送到任意指定的地方)
          例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          定義一個(gè)名為stdout的輸出目的地,ConsoleAppender為控制臺。
          ③、配置日志信息的格式(布局)Layout
          Layout 
          負(fù)責(zé)格式化Appender的輸出。
          其語法為:
          log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
          log4j.appender.appenderName.layout.option1 = value1 
          … 
          log4j.appender.appenderName.layout.optionN = valueN 
          其中,Log4j提供的layout有以下幾種: 
          org.apache.log4j.HTMLLayout
          (以HTML表格形式布局), 
          org.apache.log4j.PatternLayout
          (可以靈活地指定布局模式), 
          org.apache.log4j.SimpleLayout
          (包含日志信息的級別和信息字符串), 
          org.apache.log4j.TTCCLayout
          (包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)

          格式化日志信息

          Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下: 
          %m 
          輸出代碼中指定的消息
          %p 
          輸出優(yōu)先級,即DEBUGINFOWARNERRORFATAL 
          %r 
          輸出自應(yīng)用啟動到輸出該log信息耗費(fèi)的毫秒數(shù) 
          %c 
          輸出所屬的類目,通常就是所在類的全名 
          %t 
          輸出產(chǎn)生該日志事件的線程名 
          %n 
          輸出一個(gè)回車換行符,Windows平臺為“rn”,Unix平臺為“n 
          %d 
          輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:20021018 221028921 
          %l 
          輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。
          4.Logger組件的繼承性

          Log4j中定義的Logger可以有繼承關(guān)系,Log4j提供了一個(gè)root Logger,它是所有Logger的”根”,其它的Logger都會繼承root Logger.Logger 之間的繼承關(guān)系是通過名稱體現(xiàn)的,例如:log4j.logger.helloappLogger.childLogger的名稱是在log4j.logger.helloappLogger之后加符號“.”定義的,則childLogger繼承helloappLogger.

          Logger組件的繼承關(guān)系有以下特點(diǎn):

               如果子Logger沒有定義日志級別,則繼承父Logger的日志級別。

               如果子Logger定義了日志級別,則不會繼承父Logger的日志級別。

                默認(rèn)情況,子Logger會繼承Logger的所有Appender,反它們加入到自己的Appender中。

           

          附錄 A Log4j配置相對路徑實(shí)現(xiàn)日志記錄

          Log4j配置相對路徑實(shí)現(xiàn)日志記錄有三種辦法:

          ①、              用相代替絕對

          實(shí)log4jFileAppender本身就有這樣的機(jī)制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log其中${WORKDIR}/個(gè)變量,System Property中的WORKDIR代替。這樣,我就可以在log4j配置文件之前,先用System.setProperty設(shè)置好根路

          ②、             可以使用環(huán)境變量

          log4j.appender.R=org.apache.log4j.RollingFileAppender 
          log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log 
          log4j.appender.R.MaxFileSize=10KB

          ③、             采用了動態(tài)改變?nèi)罩韭窂椒椒▉韺?shí)現(xiàn)相對路徑保存日志文件

          代碼:

          public class Log4jInit extends HttpServlet {   

               static Logger logger = Logger.getLogger(Log4jInit.class);     

               public Log4jInit() {        }   

               public void init(ServletConfig config) throws ServletException     {   

          String prefix = config.getServletContext().getRealPath("/");       String file = config.getInitParameter("log4j");   

           String filePath = prefix + file;  

           Properties props = new Properties();   

                   try {   

                    FileInputStream istream = new FileInputStream(filePath);   

                        props.load(istream);   

                        istream.close();   

                        String logFile = prefix + props.getProperty("log4j.appender.file.File");//設(shè)置路徑   

                       props.setProperty("log4j.appender.file.File",logFile);                

                   PropertyConfigurator.configure(props);//裝入log4j配置信息   

                  } catch (IOException e) {   

            toPrint("Could not read configuration file [" + filePath + "].");   toPrint("Ignoring configuration file [" + filePath + "].");                return;            }   

              }   

              public static void toPrint(String content) {   

              System.out.println(content);   

              }   

             }   

          (2).Web.xml中的配置

          代碼

          1. <servlet>       
          2.   <servlet-name>log4j-init</servlet-name>       
          3.   <servlet-class>Log4jInit</servlet-class>  
          4.   <init-param>  
          5.     <param-name>log4j</param-name>  
          6.     <param-value>WEB-INF/classes/log4j.properties</param-value>        
          7.   </init-param>       
          8.     <load-on-startup>1</load-on-startup>  
          </servlet> 
          posted on 2012-08-26 21:27 宏才 閱讀(283) 評論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 河北省| 平乡县| 澜沧| 桓台县| 容城县| 遂昌县| 新兴县| 图木舒克市| 和硕县| 建平县| 深水埗区| 水城县| 龙井市| 巴林左旗| 台湾省| 邹城市| 茌平县| 鄄城县| 上虞市| 博罗县| 酒泉市| 明溪县| 江华| 广丰县| 博罗县| 固原市| 志丹县| 十堰市| 南汇区| 扶风县| 唐山市| 临沂市| 大方县| 宣汉县| 武义县| 平陆县| 元朗区| 松潘县| 唐河县| 民权县| 鄂托克旗|