以前開發KJava遊戲,沒有開發多長時間,然後就轉android上了,接觸過android的都知道android有Log列印日誌,最近由於工作需要,不得列印日誌...
雖然之前都是有列印一些資訊,System.out.println();....發現是有點用,但是當你程式大了,沒有添加一些其他的資料就非常麻煩了,比如列印某個函數,然後多少行出錯,System.out都莫有辦法實現了,你不可能把你對應的函數也列印進去吧...萬一添加代碼,你這個函數又得改,而且會把你搞死,這是用日誌就體現大的強大了...廢話多說了~
1、依賴包
log4j.jar 下載地址:http://labs.mop.com/apache-mirror/logging/log4j/1.2.17/log4j-1.2.17.zip
commons-logging-1.0.4.jar 下載地址:http://www.java2s.com/Code/Jar/c/Downloadcommonslogging104jar.htm
2、配置根Logger,其文法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日誌記錄的優先順序,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的層級。Log4j建議只使用四個層級,優先順序從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裡定義的層級,您可以控制到應用程式中相應層級的日誌資訊的開關。比如在這裡定義了INFO層級,則應用程式中所有DEBUG層級的日誌資訊將不被列印出來。
appenderName就是指定日誌資訊輸出到哪個地方。您可以同時指定多個輸出目的地。
3、配置日誌資訊輸出目的地Appender,其文法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天產生一個記錄檔),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案),
org.apache.log4j.WriterAppender(將日誌資訊以流格式發送到任意指定的地方)
(1).ConsoleAppender選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
Target=System.err:預設情況下是:System.out,指定輸出控制台
(2).FileAppender 選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
File=mylog.txt:指定訊息輸出到mylog.txt檔案。
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
(3).DailyRollingFileAppender 選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
File=mylog.txt:指定訊息輸出到mylog.txt檔案。
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
DatePattern=’.'yyyy-ww:每周滾動一次檔案,即每周產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下:
1)’.'yyyy-MM: 每月
2)’.'yyyy-ww: 每周
3)’.'yyyy-MM-dd: 每天
4)’.'yyyy-MM-dd-a: 每天兩次
5)’.'yyyy-MM-dd-HH: 每小時
6)’.'yyyy-MM-dd-HH-mm: 每分鐘
(4).RollingFileAppender 選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
File=mylog.txt:指定訊息輸出到mylog.txt檔案。
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
MaxFileSize=100KB: 尾碼可以是KB, MB 或者是 GB. 在記錄檔到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1檔案。
MaxBackupIndex=2:指定可以產生的滾動檔案的最大數。
4、配置日誌資訊的布局,其文法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定配置模式),
org.apache.log4j.SimpleLayout(包含日誌資訊的層級和資訊字串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等資訊)
5、輸出格式設定
在設定檔中可以通過log4j.appender.A1.layout.ConversionPattern設定日誌輸出格式。
參數:
%p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c: 輸出日誌資訊所屬的類目,通常就是所在類的全名
%t: 輸出產生該日誌事件的線程名
%l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
%%: 輸出一個”%”字元
%F: 輸出日誌訊息產生時所在的檔案名稱
%L: 輸出代碼中的行號
%m: 輸出代碼中指定的訊息,產生的日誌具體資訊
%n: 輸出一個斷行符號分行符號,Windows平台為”\r\n”,Unix平台為”\n”輸出日誌資訊換行
可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,預設的情況下靠右對齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,”-”號指定靠左對齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會有空格。
4)%20.30c:如果category的名稱小於20就補空格,並且靠右對齊,如果其名稱長於30字元,就從左邊交遠銷出的字元截掉。
6、在程式中的使用
在程式中使用Log4j之前,首先要將commons-logging.jar和logging-log4j-1.2.9.jar匯入到classpath中,並將log4j.properties放於src根目錄中。接下來就可以使用了。
7、得到記錄器
使用Log4j,第一步就是擷取日誌記錄器,這個記錄器將負責控制日誌資訊。其文法為:
public static Logger getLogger( String name),
通過指定的名字獲得記錄器,如果必要的話,則為這個名字建立一個新的記錄器。Name一般取本類的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;
註:推薦使用commons-logging結合log4j進行日誌記錄
private static Log logger = LogFactory.getLog(Yourclass.class);
8、插入記錄資訊(格式化日誌資訊)
當上兩個必要步驟執行完畢,您就可以輕鬆地使用不同優先順序別的日誌記錄語句插入到您想記錄日誌的任何地方,其文法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
9、設定檔log4j.properties: 這是我配的一個簡單的
# 應用於控制台log4j.rootLogger=info, stdout#output model stylelog4j.appender.stdout=org.apache.log4j.ConsoleAppender#output layoutlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout#output formlog4j.appender.stdout.layout.ConversionPattern=%d %5p %c [%t] (%F:%L) - %m%n
每日儲存一份
log4j.appender.file = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.file.File=log./loglog4j.appender.file.DatePattern='.'yyyy-MM-dd'.log'log4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d %5p (%F:%L) - %m%n
Java 檔案:
/** * @Title: * @Description: TODO(用一句話描述該檔案做什麼) * @author Potter * @date 2013-1-11 下午03:40:37 * @version V1.0 */public class LogDemo {static Log log=LogFactory.getLog(LogDemo.class);public void log(){ PropertyConfigurator.configure("/config./log4j.properties"); log.debug("dsafsd"); log.info("222"); log.warn("333"); log.error("4444"); log.fatal("5555");}public static void main(String[] args) {PropertyConfigurator.configure("./config/log4j.properties");log.info("start");CCC c=new CCC();}}
CCC類:
class CCC{public CCC(){LogDemo.log.warn("CCC cu");}}
運行結果:
2013-01-11 21:09:16,313 INFO LogDemo [main] (LogDemo.java:33) - start
2013-01-11 21:09:16,314 WARN LogDemo [main] (CCC.java:10) - CCC cu
現在看資訊就舒服多了吧~
補充:
1、其實仔細看的朋友會發現:log=LogFactory.getLog(LogDemo.class);
這樣我就是想看下面的輸出來的日誌,那個的位置的那個類,是不是固定成Logdemo ...呵呵。看結果是不是固定了,呵呵,不是固定的太好了,我們就不需要每次去.getLog(class) 了,定義一個成靜態,然後全程式都調用此log來列印我們的就ok了
2、最好也把這個log4j.properties 可配置的:我建立了一個config檔案夾和src檔案夾同目錄下,然後動態擷取,到時候打包程式後,不用重新打包也可以配置這個日誌設定檔...不知道請看此篇文章:http://blog.csdn.net/aa4790139/article/details/8480395
參看文章:
http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html
http://blog.csdn.net/wirelessqa/article/details/7649845