Spring MVC+Spring框架使用log4j的學習總結

作為程序員在日常的開發過程中,經常會遇到各種Bug,對于這種情況,作為初學者,我之前一直是在自己覺得可能出錯的地方,輸出相關變量的值。這種“笨”辦法對于某些簡單的Bug是可以的,但是大多數情況下是不可行的,要想快速定位程序出錯的位置,最好的就是查看相關的日志文件。本文主要介紹如何在我們的項目中使用log4j來記錄日志。如有錯誤之處還請指出、見諒。

1. log4j

Log4j是一個用Java編寫的可靠,快速和靈活的日志框架(API),是Apache的一個開放源代碼項目。我們可以通過使用log4j可以向我們定義的地方、按照我們指定的格式輸出日志文件。
log4j主要由三個組件組成:

1.logger : 負責捕獲、記錄日志,通過它我們可以選擇記錄不同優先級的日志
2.appender : 負責發布日志,通過它我們可以指定日志的輸出地方
3.layout : 負責日志的格式,通過它我們可以按照我們自己定義的格式來輸出日志

下面分別對這三個組件進行展開:

1.1 logger

之前有說通過它我們可以有選擇性的輸出不同優先級的日志,那么日志的優先級是什么?
日志的優先級按照優先級從低到高,可以分為:

DEBUG < INFO < WARN < ERROR < FATAL

這其中FATAL為致命的錯誤,會導致程序無法運行,ERROR 為嚴重錯誤 主要是程序的錯誤,WARN 為一般警告,比如session丟失,INFO 為一般要顯示的信息,比如登錄登出,DEBUG 為程序的調試信息

1.2 appender

一般情況下,appender的常用的值可以為:

  1. org.apache.log4j.ConsoleAppender(控制臺)
  2. org.apache.log4j.FileAppender(文件)
  3. org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
  4. org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)

之前有說,appender主要是定義了日志的輸出地方,如果appender的值為org.apache.log4j.FileAppender則表示將日志以文件的形式輸出。

1.3 layout

layout定義了日志的輸出格式,其取值可以為:

  1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  2. org.apache.log4j.PatternLayout(可以靈活地指定布局模式
  3. org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
  4. org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

一般都會使用org.apache.log4j.PatternLayout,當使用org.apache.log4j.PatternLayout作為layout的取值時,可以結合具體的輸出格式控制來格式化每一條記錄的輸出:

  1. %c 輸出所屬類的全名,可在修改為 %d{Num} ,Num類名輸出的維(如:"org.apache.elathen.ClassName",%C{2}將輸出elathen.ClassName)
  2. %d 輸出日志時間其格式為 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
  3. %l 輸出日志事件發生位置,包括類目名、發生線程,在代碼中的行數
  4. %n 換行符
  5. %m 輸出代碼指定信息,如info(“message”),輸出message
  6. %p 輸出優先級,即 FATAL ,ERROR 等
  7. %r 輸出從啟動到顯示該log信息所耗費的毫秒數
  8. %t 輸出產生該日志事件的線程名

2. log4j配置

前面介紹了log4j的一些組件,看起來肯定是一頭霧水,現在我們動手把log4j配置到我們的項目中。
在web項目中使用log4j首先要創建它的配置文件,可以是以xml文件或者是property文件的形式,本文我們使用property文件的形式。
log4j.properties

log4j.rootLogger = info,stdout,D,E

#配置stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n

#配置D
log4j.appender.D = org.apache.log4j.RollingFileAppender
log4j.appender.D.File = /Users/xiangang/JavaWebLearning/Log4j-Test/log/log.log
log4j.appender.D.Append = truelog4j.appender.D.Threshold = INFO
log4j.appender.D.MaxFileSize=5MB
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n

#配置E
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File = /Users/xiangang/JavaWebLearning/Log4j-Test/log/error.log
log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR
log4j.appender.E.MaxFileSize=5MB
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n

上面的配置文件是按照如下的模式來進行配置的,通常情況下,都會按照下面的格式來配置:

#配置根Logger
log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …

#配置日志信息輸出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN 

#配置日志信息的格式layout
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.optionN = valueN

這里需要解釋一下的是根loggerrootLogger繼承自logger,如果想從源碼的角度分析可以參考:http://www.cnblogs.com/davidwang456/p/4243161.html

要想使用log4j,除了配置完log4j的配置文件,還要在applicationContext初始化的時候加載它的配置文件。本文是在Spring框架中使用,所以相對來說比較簡單,在web.xml中進行簡單設置即可,在其他環境下使用log4j的可以參考:http://www.codeceo.com/article/log4j-usage.html

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"           
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee        
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"         version="3.0">    

<!--設置log4j配置文件-->    
<context-param>       
<param-name>log4jConfigLocation</param-name>        
<param-value>classpath:log4j.properties</param-value>    
</context-param>    
<!--log4j的初始化類-->   
 <listener>        
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>    
</listener>    

<!--定義Filter進行用戶驗證-->    
<filter>        
<filter-name>loginValidation</filter-name>        
<filter-class>filter.LoginValidation</filter-class>        
<init-param>            
<param-name>logonPath</param-name>            
<param-value>/log4j/register.jsp;/log4j/index.jsp</param-value>        
</init-param>        
<init-param>            
<param-name>redirectPath</param-name>            
<param-value>/index.jsp</param-value>        
</init-param>    
</filter>    
<filter-mapping>        
<filter-name>loginValidation</filter-name>        
<url-pattern>/*</url-pattern>    
</filter-mapping>    

<!--配置字符過濾器,防止出現中文亂碼-->    
<filter>        
<filter-name>CharacterEncodingFilter</filter-name>        
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        
<init-param>            
<param-name>encoding</param-name>            
<param-value>utf-8</param-value>        
</init-param>    
</filter>    
<filter-mapping>        
<filter-name>CharacterEncodingFilter</filter-name>        
<url-pattern>/*</url-pattern>    
</filter-mapping>    

<!--設置Spring MVC的前置控制器-->    
<servlet>        
<servlet-name>DispactherServlet</servlet-name>        
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        
<init-param>            
<param-name>contextConfigLocation</param-name>            
<param-value>classpath:dispatcherServlet.xml</param-value>        
</init-param>        
<load-on-startup>1</load-on-startup>    
</servlet>    
<servlet-mapping>        
<servlet-name>DispactherServlet</servlet-name>        
<url-pattern>/</url-pattern>    
</servlet-mapping>    
<welcome-file-list>        
<welcome-file>index.jsp</welcome-file>    
</welcome-file-list>
</web-app>

build.gradle

group 'xiangang.wei'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8

repositories {   
jcenter()    
mavenCentral()
}

dependencies {    
testCompile group: 'junit', name: 'junit', version: '4.11'    
// servlet-api    
compile group: 'javax.servlet', name: 'servlet-api', version: '2.5'    
// log4j api    
compile group: 'log4j', name: 'log4j', version: '1.2.17'    
//spring api    
compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.3.RELEASE'    
compile group: 'org.springframework', name: 'spring-orm', version: '4.3.3.RELEASE'    
compile group: 'org.springframework', name: 'spring-aspects', version: '4.3.3.RELEASE'
}

其余代碼在:https://github.com/xiangang-wei/log4j

配置好本地Tomcat運行后在控制臺可以看到:

控制臺打印的日志信息

我們還可以在本地文件夾里看到輸出的兩個日志文件:

生成的日志文件

打開log.log文件:

log.log
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • 在應用程序中添加日志記錄總的來說基于三個目的:監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析...
    時待吾閱讀 5,013評論 0 6
  • 在應用程序中添加日志記錄總的來說基于三個目的:監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析...
    時待吾閱讀 5,076評論 1 13
  • 一、Log4j簡介 Log4j有三個主要的組件:Loggers(記錄器),Appenders (輸出源)和Layo...
    默默守護閱讀 1,922評論 2 8
  • from:https://www.cnblogs.com/ITtangtang/p/3926665.html一、L...
    enshunyan閱讀 3,318評論 0 0
  • #########################################################...
    BearFaraway閱讀 1,780評論 0 51