Java log4j教程
一:Log4j入門簡介學習
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸送的目的地是控制枱、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。
此外,通過Log4j其他語言接口,您可以在C、C++、、PL/SQL程序中使用Log4j,其語法和用法與在Java程序中一樣,使得多語言分佈式系統得到一個統一一致的日誌組件模塊。而且,通過使用各種第三方擴展,您可以很方便地將Log4j集成到J2EE、JINI甚至是SNMP應用中。
二、入門實例
1.新建一個JAva工程,導入包,整個工程最終目錄如下
2、src同級創建並設置erties
### 設置###
Logger = debug,stdout,D,E
### 輸出信息到控制抬 ###
ut = oleAppender
et =
ut = ernLayout
ersionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 輸出DEBUG 級別以上的日誌到=E://logs/ ###
nder.D = yRollingFileAppender
= E://logs/
nd = true
shold = DEBUG
ut = ernLayout
ersionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 輸出ERROR 級別以上的日誌到=E://logs/ ###
nder.E = yRollingFileAppender
=E://logs/
nd = true
shold = ERROR
ut = ernLayout
ersionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
3、設置日誌內容
package c;import er;/** *@author linbingwen *@2015年5月18日9:14:21 */public class Test { private static Logger logger = ogger(s); /** * @param args */ public static void main(String[] args) { // tln("This is println message."); // 記錄debug級別的信息 g("This is debug message."); // 記錄info級別的信息 ("This is info message."); // 記錄error級別的信息 r("This is error message."); } }
4、輸出結果
(1)首先是控制枱的信息
(2)再來看輸出的文件
內容如下,發現已按照要求輸出到對應的文檔中去了。
三、Log4j基本使用方法
Log4j由三個重要的組件構成:日誌信息的優先級,日誌信息的輸出目的地,日誌信息的輸出格式。日誌信息的優先級從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日誌信息的`重要程度;日誌信息的輸出目的地指定了日誌將打印到控制枱還是文件中;而輸出格式則控制了日誌信息的顯 示內容。
2.1、定義配置文件
其實您也可以完全不使用配置文件,而是在代碼中配置Log4j環境。但是,使用配置文件將使您的應用程序更加靈活。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面我們介紹使用Java特性文件做為配置文件的方法:
1.配置根Logger,其語法為:
Logger = [ level ] , appenderName, appenderName, …
其中,level 是日誌記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裏定義的級別,您可以控制到應用程序中相應級別的日誌信息的開關。比如在這裏定 義了INFO級別,則應用程序中所有DEBUG級別的日誌信息將不被打印出來。 appenderName就是指B日誌信息輸出到哪個地方。您可以同時指定多個輸出目的地。
2.配置日誌信息輸出目的地Appender,其語法為:
nderName = s
on1 = value1
…
on = valueN
其中,Log4j提供的appender有以下幾種:
oleAppender(控制枱),
Appender(文件),
yRollingFileAppender(每天產生一個日誌文件),
ingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
erAppender(將日誌信息以流格式發送到任意指定的地方)
3.配置日誌信息的格式(佈局),其語法為:
ut = s
on1 = value1
…
on = valueN
其中,Log4j提供的layout有以e幾種:
Layout(以HTML表格形式佈局),
ernLayout(可以靈活地指定佈局模式),
leLayout(包含日誌信息的級別和信息字符串),
Layout(包含日誌產生的時間、線程、類別等等信息)
Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,打印參數如下: %m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個回車換行符,Windows平台為“rn”,Unix平台為“n”
%d 輸出日誌時間點的日期或時間,默認格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:()
2.2、在代碼中使用Log4j
1.得到記錄器
使用Log4j,第一步就是獲取日誌記錄器,這個記錄器將負責控制日誌信息。其語法為:
public static Logger getLogger( String name)
通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。Name一般取本類的名字,比如:
static Logger logger = ogger ( ame () )
2.讀取配置文件
當獲得了日誌記錄器之後,第二步將配置Log4j環境,其語法為:
igure (): 自動快速地使用缺省Log4j環境。
igure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。
igure ( String filename ) :讀取XML形式的配置文件。
3.插入記錄信息(格式化日誌信息)
當上兩個必要步驟執行完畢,您就可以輕鬆地使用不同優先級別的日誌記錄語句插入到您想記錄日誌的任何地方,其語法如下:
g ( Object message ) ;
( Object message ) ;
( Object message ) ;
r ( Object message ) ;
2.3、日誌級別
每個Logger都被了一個日誌級別(log level),用來控制日誌信息的輸出。日誌級別從高到低分為:
A:off 最高等級,用於關閉所有日誌記錄。
B:fatal 指出每個嚴重的錯誤事件將會導致應用程序的退出。
C:error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
D:warm 表明會出現潛在的錯誤情形。
E:info 一般和在粗粒度級別上,強調應用程序的運行全程。
F:debug 一般用於細粒度級別上,對調試應用程序非常有幫助。
G:all 最低等級,用於打開所有日誌記錄。
上面這些級別是定義在l類中。Log4j只建議使用4個級別,優先級從高到低分別是error,warn,info和debug。通過使用日誌級別,可以控制應用程序中相應級別日誌信息的輸出。例如,如果使用b了info級別,則應用程序中所有低於info級別的日誌信息(如debug)將不會被打印出來。
四、Web項目中使用Log4j實例
上面代碼描述了Log4j的簡單應用,其實使用Log4j也就是這樣簡單方便。當然除了上面的配置方法,還有其它,比如做一個J2EE應用,在J2EE應用使用Log4j,必須先在啟動服務時加載Log4j的配置文件進行初始化,可以在中進行。
1、web應用的log4j使用基本上都採用:新建一個servlet,這個servlet在init函數中為log4j執行配置。一般就是讀入配置文件。所以需要在中為這個servlet配置,同時設定load-on-startup為1。
2、這個servlet配置log4j就是讀出配置文件,然後調用configure函數。這裏有兩個問題:一、需要知道文件在哪裏;二、需要正確的文件類型
3、配置文件位置在中配置一個param即可,路徑一般是相對於web的root目錄
4、文件類型一般有兩種,一個是Java的property文件,另一種是xml文件
配置文件的大致內容:log4j可以指定輸出的log級別的最低等級,以及log的輸出配置格式,每個log可以指定多個輸出方式
(1)創建Web工程,整個工程最後目錄如下
(2)配置如下:
<"1.0" encoding="UTF-8">
(3)配置文件erties
### set log levels ###
Logger = debug,stdout,D,E
ut = oleAppender
et =
ut = ernLayout
ersionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
nder.D = yRollingFileAppender
= F://logs/
nd = true
shold = DEBUG
ut = ernLayout
ersionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
nder.E = yRollingFileAppender
=F://logs/
nd = true
shold = ERROR
ut = ernLayout
ersionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
(4)web容器一來就初始化的servlet
package c; import ; import ception; import letConfig; import letContext; import letException; import ervlet; import Servlet; import ServletRequest; import ServletResponse; import cConfigurator; import ertyConfigurator; /** * Servlet implementation class Log4JInitServlet */ @WebServlet("/Log4JInitServlet") public class Log4JInitServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Log4JInitServlet() { super(); // TODO Auto-generated constructor stub } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { tln("Log4JInitServlet 正在初始化 log4j日誌設置信息"); String log4jLocation = nitParameter("log4j-properties-location"); ServletContext sc = ervletContext(); if (log4jLocation == null) { tln("*** 沒有 log4j-properties-location 初始化的文件, 所以使用 BasicConfigurator初始化"); igure(); } else { String webAppPath = ealPath("/"); String log4jProp = webAppPath + log4jLocation; File yoMamaYesThisSaysYoMama = new File(log4jProp); if (ts()) { tln("使用: " + log4jProp+"初始化日誌設置信息"); igure(log4jProp); } else { tln("*** " + log4jProp + " 文件沒有找到, 所以使用 BasicConfigurator初始化"); igure(); } } (config); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
調用日誌Log4JTestServlet,java
package c; import ception; import letConfig; import letException; import ervlet; import Servlet; import ServletRequest; import ServletResponse; import er; /** * Servlet implementation class Log4JTestServlet */ @WebServlet("/Log4JTestServlet") public class Log4JTestServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static Logger logger = ogger(s); /** * @see HttpServlet#HttpServlet() */ public Log4JTestServlet() { super(); // TODO Auto-generated constructor stub } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 記錄debug級別的信息 g("This is debug message."); // 記錄info級別的信息 ("This is info message."); // 記錄error級別的信息 r("This is error message."); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
接下來就是運行了,來看看結果:
輸出結果:
五、Spring中使用Log4j
這裏要實現web項目中利用Spring來使用Log4j
(1)接上面的工程,然後再導入Spring的包
(2)增加
整個內容如下:
<"1.0" encoding="UTF-8">
這裏就相當於沒用到了。
(2)
沒有內容:
<"1.0" encoding="UTF-8">
(3)這樣日誌就跟隨Spring窗口啟動而啟動了
程序一運行,就會自動把日誌打印
為空,因為它只打印error級別以上的信息
瀏覽器輸入http://localhost:8080/LogLearning2/test
然後打開文件
-
計算機二級Java備考習題及答案
練習可以幫助我們加深對知識的記憶和理解,下面是本站小編整理的2017計算機二級Java備考練習題及答案,歡迎學習!備考練習題一1、下列敍述中,錯誤的是______。A、Applet的默認佈局管理器是FlowLayoutB、JApplet中增加構件是加到JApplet的內容面板上,不是直接加到JApp...
-
Java中運算符的使用
導語:計算機的最基本用途之一就是執行數學運算,作為一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。下面是java中運算符的使用,一起來學習下吧:算術運算符單目:+(取正)-(取負)++(自增1)--(自減1)雙目:+-*/%(取餘)三目:a>b?true:false説明:當a大於b的時候,為tru...
-
Java創建線程的三種方法
導語:編寫多線程程序是為了實現多任務的併發執行,從而能夠更好地與用户交互。下面是Java創建線程的三種方法,一起來學習下吧:Runnable和Callable的區別(1)Callable規定的方法是call(),Runnable規定的方法是run().(2)Callable的任務執行後可返回值,而Runnable的任務...
-
java與JavaScript語言有何不同
java和JavaScript是兩個不同的語言。那麼這兩個語言有什麼不同呢?下面本站小編帶大家一起來看看詳細內容,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!講個故事:話説很久很久以前,有一個叫網景(Netscape)的,十月懷胎,他生了個兒子,很開興,...