亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Apache通用日志工具commons-logging和Log4j 使

系統 2107 0
前言

在程序開發中,有時候為了跟蹤代碼的運行情況,需要在程序代碼中加入一些打印代碼運行情況的日志代碼,在早期的C語言中,一般都是用printf()函數來實現這些信息的輸出,在Java語言中用 System..out.println()來實現控制臺信息輸出。這種輸出的信息功能非常有限,如果要輸出到文件,就很麻煩。并且,如果以后想去掉(不再輸出)這些信息,還需要手動的一行一行去改。 當然,也有一種解決辦法可以實現處理這個問題,在Java中,可以這么寫:

------------------------------------------------------
package org.lavasoft.test1;

/**
* File Name:?? LogUtil.java
* Created by:? IntelliJ IDEA.
* Copyright:?? Copyright (c) 2003-2006
* Company:???? LavaSoft( http://lavasoft.blog.51cto.com )
* Author:????? leizhimin
* Modifier:??? leizhimin
* Date Time:?? 2007-5-7 16:38:19
* Readme:????? 手動日志工具類
*/
public class LogUtil {
??? private static boolean logSwitch=true;? //日志開關,默認為開
??? public static void log(String smg){
??????? if(logSwitch){
??????????? System.out.println(smg);
??????? }
??? }
} ------------------------------------------------------
package org.lavasoft.test1;

/**
* File Name:?? ManualLogApp.java
* Created by:? IntelliJ IDEA.
* Copyright:?? Copyright (c) 2003-2006
* Company:???? LavaSoft( http://lavasoft.blog.51cto.com )
* Author:????? leizhimin
* Modifier:??? leizhimin
* Date Time:?? 2007-5-7 16:38:02
* Readme:????? 手動日志工具測試
*/
public class ManualLogApp {
??? public static void main(String[] args){
??????? new ManualLogApp().test();
??? }

??? public void test(){
??????? LogUtil.log("我在手動打日志,呵呵!");
??? }
}

通過這兩個類,就實現一個簡單的日志工具。當你不想打印日志的時候,可以在LogUtil中改 logSwitch的值為flase,那么日志打印功能就關閉了。如果你愿意,你可以將這個開關放到一個配置文件中去修改。還可以讓日志打印到文件,但是當你修改實現這個功能的時候,這個日志工具會變得相當的復雜。

為了解決上面的問題,Apache針對不同的語言平臺為做了一系列日志工具包,可應用于java、.net、 php、c++,這些日志包都是免費的,使用非常方便,可以極大提高編程效率。并且,Apache為了讓眾多的日志工具有一個相同操作方式,還實現做了一個通用日志工具包commons-logging 。

commons-logging是為那些需要建立在不同環境下使用不同日志架構的組件或庫的開發者創建的,其中包括Apache Log4j以及Java log的日志架構。把日志信息commons-logging的Log接口,并由commons-logging在運行時決定使用哪種日志架構。
現在,以我見,Apache通用日志工具commons-logging和Log4j已經成為Java日志的標準工具。

下面我Log4j(對Java平臺的)和通用日志工具包commons-logging的應用做一個總結。

一、 Log4j的架構

Log4j系統的三大板塊:日志寫入器、日志輸出終端、日志布局模式。
Apache通用日志工具commons-logging和Log4j 使用總結 .

Logger類是日志包的核心,Logger的名稱是大小寫敏感的,并且名稱之間有繼承關系。子名由父名做前綴,用點號“.”分隔,如x.y是x.y.z的父親Logger。

Logger系統中有個根logger,是所有logger的祖先,它總是存在的,并且不可以通過名字獲取,可以通過Logger.getRootLogger()來獲取。

獲取Logger對象的方法很多,可以參考API文檔:
static Logger getLogger(Class clazz)
????????? Shorthand for getLogger(clazz.getName()).
static Logger getLogger(String name)
????????? Retrieve a logger named according to the value of the name parameter.
static Logger getLogger(String name, LoggerFactory factory)
????????? Like getLogger(String) except that the type of logger instantiated depends on the type returned by the LoggerFactory.makeNewLoggerInstance(java.lang.String) method of the factory parameter.
static Logger getRootLogger()
????????? Return the root logger for the current logger repository.

在某對象中,用該對象所屬的類作為參數,調用 Logger.getLogger(Class clazz)以獲取logger對象被認為是目前所知最理智的命名logger方法。

用同名參數調用Logger.getLogger(Class clazz)將返回同一個logger對象。Logger的創建可以按照任意順序,log4j將自動維護logger的繼承樹。

二、 Log4j的日志級別(Level)

每個logger都有一個日志級別,用來控制日志的輸出。未分配級別的logger將自動繼承它最近的父 logger的日志級別。Logger的由低到高級別如下:
ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF

Logger的級別越低,輸出的日志越詳細。

三、 Log4j的輸出終端(Appender接口)

Log4j提供了以下幾個實現:
? org.apache.log4j.ConsoleAppender(控制臺)
? org.apache.log4j.FileAppender(文件)
? org.apache.log4j.DailyRollingFileAppender(每天都產生一個日志文件)
? org.apache.log4j.RollingFileAppender(文件大小達到指定尺寸時產生一個新的日志文件,文件名稱上會自動添加數字序號。)
? org.apache.log4j.WriterAppender(將日志信息以流的格式發送到任意指定的地方)

默認情況下,子logger將繼承父logger的所有appenders。

rootlogger擁有目標為system.out的 consoleAppender,故默認情況下,所有的logger都將繼承該appender。

四、 Log4j的輸出布局模式(Layout接口)
Log4j提供Layout有以下幾種:
? org.apache.log4j.HTMLLayout(以HTML表格形式布局)
? org.apache.log4j.PatternLayout(可以靈活地指定布局模式)
? org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
? org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等信息)

Log4j采用類似C語言中的printf函數的打印格式格式化日志信息。打印參數如下:
%m:輸出代碼中指定的消息。
%p:輸出優先級。
%r:輸入自應用啟動到輸出該log信息耗費的毫秒數。
%c:輸出所屬的類目,通常就是所在類的全名。
%t:輸出產生該日志線程的線程名。
%n:輸出一個回車換行符。Windows平臺為“/r/n”,UNIX為“ /n”。
%d:輸出日志時間點的日期或時間,默認格式為ISO8601,推薦使用 “%d{ABSOLUTE}”,這個輸出格式形如:“2007-05-07 18:23:23,500”,符合中國人習慣。
%l:輸出日志事件發生的位置,包括類名、線程名,以及所在代碼的行數。

五、 Log4j的配置

在實際使用中,Log4j一般是通過配置文件配置使用的。配置文件有兩種,Java properties和XML文件。一般都選用properties文件來配置,因為簡潔易讀。下面只介紹Java properties的配置方式。

對Log4j的配置就是對rootLogger和子Logger的配置。主要的配置項為:rootLogger、輸出終端、輸出布局模式。

所有的配置項都必須以log4j開頭。

下面給出一個配置文件的示例,用以說明配置的方法。

log4j.properties
-------------------------------------------------------------------------------------------------
1 ### logger的配置 ###
2 #配置根logger
3 log4j.rootLogger=INFO,stdout
4 #配置子logger:org.lavasoft(在org.lavasoft包中類的日志在沒有指定子logger名的情況下使用這個logger)
5 log4j.logger.org.lavasoft=ERROR,file
6 #配置子logger:org.lavasoft.test(在org.lavasoft.test包中類的日志在沒有指定子logger名的情況下使用這個logger)
7 log4j.logger.org.lavasoft.test=ERROR,file1,stdout
8
9 ### direct log messages to stdout ### (標準的終端輸出)
10 #控制臺輸出
11 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
12 #自定義輸出布局
13 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
14 #輸出的格式
15 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
16
17 ### direct messages to file ttt.log ### (輸入到文件ttt.log的配置)
18 #輸出到滾動文件
19 log4j.appender.file=org.apache.log4j.RollingFileAppender
20 #輸出文件最大為10M
21 log4j.appender.file.MaxFileSize=10MB
22 #輸出文件最大序號為10
23 log4j.appender.file.MaxBackupIndex=10
24 #輸出文件路徑
25 log4j.appender.file.File=C:/ttt.log
26 #自定義輸出布局
27 log4j.appender.file.layout=org.apache.log4j.PatternLayout
28 #輸出格式
29 log4j.appender.file.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
30
31 ### direct messages to file ttt.log ### (輸入到文件ttt1.log的配置)
32 #輸出到滾動文件
33 log4j.appender.file1=org.apache.log4j.RollingFileAppender
34 #輸出文件最大為10M
35 log4j.appender.file1.MaxFileSize=10MB
36 #輸出文件最大序號為10
37 log4j.appender.file1.MaxBackupIndex=10
38 #輸出文件路徑
39 log4j.appender.file1.File=C:/ttt1.log
40 #自定義輸出布局
41 log4j.appender.file1.layout=org.apache.log4j.PatternLayout
42 #輸出格式
43 log4j.appender.file1.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
44
-------------------------------------------------------------------------------------------------

下面對以上的文件解說,并給出一個應用例子:
logger的配置語法為:級別,輸入終端1,輸出終端2,…
根logger的配置項為:log4j.rootLogger

子logger的配置項為:
log4j.logger.<子logger名>

在上面的配置項中,配置了一個根logger和兩個子logger,名稱為:org.lavasoft和 org.lavasoft.test,通過該名稱,利用Logger.getLogger(String name)可以獲取這兩個logger對象。

子logger的名字一般都以包名來配置,這樣當在程序通過類名獲取logger的對象就是與本類包名相同的子 logger,這樣可以方便控制某個包下面logger的輸出。

但是一般不建議設置子logger,一個通用的根logger足夠用了。由于繼承關系,并且可以在任何地方通過子logger的名字獲取logger對象,這樣容易導致混亂,比如在org.lavasoft包下的類直接獲取了名為 org.lavasoft.test子logger的對象,這是不合理的(雖然日志可以打印出來),因為如果直接在類中用 Logger.getLogger(Class clazz)方式來獲取Logger對象,則獲取到的應該是名為org.lavasoft的logger對象,而不會得到名為 org.lavasoft.test的logger對象。

以上的配置文件純粹是為了說明問題才那么寫的。

六、 Log4j與通用日志包commons- logging的結合

其實commons-logging中默認都支持Log4j,因此只要同時加載commons-logging包和log4j包,可以不用配置即可用在應用中使用commons-logging的接口方法。

當然,標準的應用的是需要的配置,如果你log4j則這個配置是可選的。下面我說明如何通過配置文件來組合 commons-logging和log4j。

配置文件內容很簡單,就指定一個日志實現類即可,下面是個示例文件:

commons-logging.properties
--------------------------------------------------------------------------------
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
--------------------------------------------------------------------------------

在使用Log4j作為日志工具的時候,commons-logging.properties的配置可以不要,在下面例子中,你可以嘗試刪除此文件,而不影響日志輸出。

log4j.properties
--------------------------------------------------------------------------------
### logger的配置 ###
#配置根logger
log4j.rootLogger=info,stdout
#配置子logger:org.lavasoft(在org.lavasoft包中類的日志在沒有指定子 logger名的情況下使用這個logger)
log4j.logger.org.lavasoft=ERROR,file
#配置子logger:org.lavasoft.test(在org.lavasoft.test包中類的日志在沒有指定子logger名的情況下使用這個logger)
log4j.logger.org.lavasoft.test=ERROR,file1,stdout

### direct log messages to stdout ### (標準的終端輸出)
#控制臺輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#自定義輸出布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#輸出的格式
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file ttt.log ### (輸入到文件ttt.log的配置)
#輸出到滾動文件
log4j.appender.file=org.apache.log4j.RollingFileAppender
#輸出文件最大為10M
log4j.appender.file.MaxFileSize=10MB
#輸出文件最大序號為10
log4j.appender.file.MaxBackupIndex=10
#輸出文件路徑
log4j.appender.file.File=C:/ttt.log
#自定義輸出布局
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#輸出格式
log4j.appender.file.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n

### direct messages to file ttt.log ### (輸入到文件ttt1.log的配置)
#輸出到滾動文件
log4j.appender.file1=org.apache.log4j.RollingFileAppender
#輸出文件最大為10M
log4j.appender.file1.MaxFileSize=10MB
#輸出文件最大序號為10
log4j.appender.file1.MaxBackupIndex=10
#輸出文件路徑
log4j.appender.file1.File=C:/ttt1.log
#自定義輸出布局
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
#輸出格式
log4j.appender.file1.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
--------------------------------------------------------------------------------

下面是TestLog工程的一個類HelloWorld.java,通過運行該類,可以看到日志的輸出情況。

org.lavasoft.test. HelloWorld.java
--------------------------------------------------------------------------------
package org.lavasoft.test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* File Name:?? HelloWorld.java
* Created by:? IntelliJ IDEA.
* Copyright:?? Copyright (c) 2003-2006
* Company:???? LavaSoft( http://lavasoft.blog.51cto.com )
* Author:????? leizhimin
* Modifier:??? leizhimin
* Date Time:?? 2007-5-6 17:49:55
* Readme:
*/
public class HelloWorld {
??? public static void main(String args[]) {
??????? Log log1=LogFactory.getLog(HelloWorld.class);
??????? log1.info("11111111通過class對象來獲取logger對象.");
??????? log1.error("111111111.....error");
??????? new HelloWorld().test();
??? }

??? public void test(){

??????? //獲取(配置文件中)名稱為log4j.logger.org.lavasoft.test的logger對象
??????? Log log2=LogFactory.getLog("org.lavasoft.test");
??????? log2.info("2222222222222222");
??????? log2.error("222222HelloWorld的Error!");

??????? //獲取(配置文件中)名稱為log4j.logger.org.lavasoft的logger對象
??????? Log log3=LogFactory.getLog("org.lavasoft");
??????? log3.info("3333333333333333");
??????? log3.error("33333..........errrr");

??????? //獲取當前類所在
??????? Log log4=LogFactory.getLog(this.getClass());
??????? log4.info("44444444");
??????? log4.error("44444444 ....error");
??? }
}
--------------------------------------------------------------------------------

運行org.lavasoft.test. HelloWorld.java,結果如下:
22:45:27,953 ERROR HelloWorld:20 - 111111111.....error
22:45:27,953 ERROR HelloWorld:20 - 111111111.....error
22:45:27,968 ERROR test:29 - 222222HelloWorld的Error!
22:45:27,968 ERROR test:29 - 222222HelloWorld的Error!
22:45:27,968 ERROR lavasoft:34 - 33333..........errrr
22:45:27,968 ERROR HelloWorld:39 - 44444444 ....error
22:45:27,968 ERROR HelloWorld:39 - 44444444 ....error

打開C盤,下面有兩個日志文件ttt.log、ttt1.log,內容如下:
ttt.log
--------------------------------------------------------------------------------
2007-05-08 22:45:27,953 ERROR [main] (HelloWorld.java:20)???? - 111111111.....error
2007-05-08 22:45:27,968 ERROR [main] (HelloWorld.java:29)???? - 222222HelloWorld的Error!
2007-05-08 22:45:27,968 ERROR [main] (HelloWorld.java:34)???? - 33333..........errrr
2007-05-08 22:45:27,968 ERROR [main] (HelloWorld.java:39)???? - 44444444 ....error
--------------------------------------------------------------------------------

ttt1.log
--------------------------------------------------------------------------------
2007-05-08 22:45:27,953 ERROR [main] (HelloWorld.java:20)???? - 111111111.....error
2007-05-08 22:45:27,968 ERROR [main] (HelloWorld.java:29)???? - 222222HelloWorld的Error!
2007-05-08 22:45:27,968 ERROR [main] (HelloWorld.java:39)???? - 44444444 ....error
--------------------------------------------------------------------------------

從兩個日志文件輸出信息(類、loging的行數)可以看到,通過名稱org.lavasoft.test獲取的logger打印的ERROR級別的日志記錄在C:/ttt1.log里面,而通過名稱org.lavasoft獲取的logger打印的ERROR級別的日志記錄在C:/ttt.log里面,通過LogFactory.getLog(this.getClass())和 LogFactory.getLog(HelloWorld.class);記錄的日志實質上根據該類所在的包名來獲取logger,因此實質上獲取的是離他最近的logger(離它最近的logger就是該包上定義的logger對象,名稱為org.lavasoft.test)。

其實仔細研究一下輸出的logger就很容易看出其中的所以然,上面這種定義子logger的方法不推薦在項目中使用,一般只定義一個rootlogger就行了。

為了交流研究方便,我把TestLog整個工程的源代碼(用IntellJ IDEA 5.12做的)打包放在附件里,當然也可以很容易的將此源代碼加入Eclipse或者NetBean工程。

Apache通用日志工具commons-logging和Log4j 使用總結 .


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品国产www | 欧美日韩亚洲国产精品 | 黄色成人在线视频 | 欧美激情亚洲激情 | 中文字幕国产 | 狠狠色噜狠狠狠狠色综合久 | 国产精品亚洲精品 | 奇米影视第四色在线观看 | 日本色色网 | 天天插天天射天天干 | 国产大战女模特在线视频 | 亚洲精品啪啪一区二区三区 | 99re热这里只有精品视频 | 九九热只有精品 | 成人免费一级片 | 欧美午夜精品久久久久免费视 | 亚洲区精品 | 老师粗又长好猛好爽视频 | 奇米第四色在线观看 | 久久久精品久久久久久久久久久 | 免费一级a毛片在线播 | 欧美精品亚洲精品日韩专区va | 亚洲国产综合专区在线播一一 | 欧美精品影视 | 国产区高清 | 欧美成人丝袜视频在线观看 | 亚洲一区二区免费视频 | 97看片吧| 欧美性色生活片天天看99 | 99热久久久久久久免费观看 | 午夜精品久久久久久久90蜜桃 | 2018一级毛片免费观看 | 国产农村妇女毛片精品久久 | 亚洲 欧美 另类 天天更新影院 | 久久久久久久久中文字幕 | 久99久热 | 97人人澡人人爽人人爱 | 亚洲精品一区二区三区福利 | 免费永久欧美性色xo影院 | 国产成人精品久久综合 | 奇米影视778成人四色狠狠 |