log4j 簡易入門

注1:本文 log4j 版本為 log4j1,以下簡稱 log4j
注2:本文沒有對 “為什么要用log4j” 作解釋,請自行查閱


從學編程第一天起,我們就學會了這一條語句:輸出 hello, world 到控制臺

System.out.println("hello, world");

下面使用log4j來完成同樣的工作

1、創建一個Web工程 log4j-demo,下載并引入3個jar包

(可在maven倉庫中搜索并下載)

log4j-1.2.15.jar

slf4j-api-1.5.10.jar

slf4j-log4j12-1.5.10.jar

2、新建一個 Servlet 類接收 get 請求

package org.test.servlet;

......    //導入的其他包

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@WebServlet(urlPatterns={"/test/master"})
public class MasterServlet extends HttpServlet {
    private static final long serialVersionUID = 1111L;
    
    private static final Logger log = LoggerFactory.getLogger(MasterServlet.class);
    
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        log.debug("hello, world");
    }
}

3、在 src 下創建一個 log4j.properties 配置文件(文件必須是這個名稱),填入下面的內容,將項目部署到 tomcat,啟動tomcat,在瀏覽器訪問 http://localhost:8080/log4j-demo/test/master

log4j.rootLogger=debug, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %d %c - %m%n

查看控制臺,打印成功,輸出如下,比用 System.out.println 時輸出了更多的信息。

[DEBUG] 2018-04-12 09:51:42,148 org.test.servlet.MasterServlet - hello, world

4、在 log.debug("hello, world") 后再添加3條代碼

log.info("hello, world");
log.warn("hello, world");
log.error("hello, world");

5、重啟tomcat,訪問,控制臺輸出如下

[DEBUG] 2018-04-12 11:33:40,841 org.test.servlet.MasterServlet - hello, world
[INFO] 2018-04-12 11:33:40,842 org.test.servlet.MasterServlet - hello, world
[WARN] 2018-04-12 11:33:40,842 org.test.servlet.MasterServlet - hello, world
[ERROR] 2018-04-12 11:33:40,842 org.test.servlet.MasterServlet - hello, world

6、log4j.rootLogger=debug 改成 log4j.rootLogger=error

得到輸出結果

[ERROR] 2018-04-12 11:36:07,638 org.test.servlet.MasterServlet - hello, world

如果不是這個輸出結果,請嘗試關閉tomcat,clean the project【菜單Project-->Clean...】,再次啟動 tomcat

日志級別

剛才第一次,我們把log4j.properties配置文件的第一行 rootLogger=debug 指定了日志級別為debug,那么就會打印在程序中所有log.debug()的信息,同時,還打印了其他的日志:log.info(),log.warn() 和 log.error()

第二次,將 rootLogger=debug 改為 rootLogger=error,就只打印了 log.error()。

可見,設置了某個級別的日志,會打印等于或高于該級別的日志。所以設置的日志等級越高,打印出來的日志就越少。

rootLogger 格式為:

log4j.rootLogger = 【 Level 】, appenderName1, appenderName2, …

【Level】可填的級別

debug
info
warn
error
fatal

從上到下,級別遞增。log4j建議只使用四個級別,debug, info, warn, error


rootLogger 設為debug,可打印debug、info、warn、error
rootLogger 設為info,可打印info,warn,error
rootLogger 設為warn,可打印warn,error
rootLogger 設為error,可打印error

輸出源

appenderName1,appenderName2 是自定義的輸出源名稱,并且可以有多個。上例我使用了console,當然也可以寫成A1、C3等等,但為了讓它具有語義、自解釋性,推薦使用有意義的輸出源名稱,比如看到輸出源叫console,就知道是向控制臺輸出的。

定義了輸出源后,才能對數據源進行配置

log4j.rootLogger=debug, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %d %c - %m%n

輸出源使用log4j框架提供的類ConsoleAppender,接著再進行下一級——layout的配置,再進行layout的下一級配置,如ConversionPattern…… 順序不能顛倒。

下面介紹輸出到控制臺的同時,輸出到指定文件里

7、添加另一個輸出源 file1

log4j.rootLogger=debug, console, file1
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %d %c - %m%n

log4j.appender.file1=org.apache.log4j.FileAppender
log4j.appender.file1.File=${catalina.base}/logs/log4j-demo/file1.log
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
log4j.appender.file1.layout.ConversionPattern=[%p] %d %c - %m%n

這行配置了要輸出的文件所在位置,${catalina.base}是該項目所部署的tomcat的路徑,見下圖。

log4j.appender.file1.File=${catalina.base}/logs/log4j-demo/file1.log

查看文件

8、只想在文件中輸出 error 級別的日志,添加下面一行

log4j.appender.file1.threshold=error

下面介紹一些log4j框架內提供的輸出源(appender)以及日志輸出格式(layout),也可以查看官方API獲取更多更詳細的信息 --> Log4j

log4j 提供的 appender 有以下幾種,前文已介紹前2種

org.apache.log4j.ConsoleAppender(控制臺)

org.apache.log4j.FileAppender(文件)

org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)

org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件

org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

log4j 提供的 layout 有以下幾種,前文已介紹第1種

org.apache.log4j.PatternLayout(可以靈活地指定布局模式)

org.apache.log4j.HTMLLayout(以HTML表格形式布局)

org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)

org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

輸出參數

%t 用來輸出生成該日志事件的線程的名稱

%p 用于輸出日志事件的優先級,即DEBUG,INFO,WARN,ERROR,FATAL

%r 用于輸出從layout(布局)的構建到日志事件創建所經過的毫秒數

%c 用于輸出日志事件的category(類別),通常就是所在類的全名

%F 用于輸出被發出日志記錄請求,其中的文件名

%d 用于輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:20017年02月18日 22:10:28,921

%L 用于輸出日志事件的發生位置,即在代碼中的行數。舉例:10

%l 用于輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)

%% 用于輸出%標志

%M 用于輸出打印該條日志的方法名

%m 用于輸出代碼中指定的消息

%n 用于輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

參考文章

配置Log4j(很詳細)

log4j(二)——如何控制日志信息的輸出

org.apache.log4j.DailyRollingFileAppender輸出不出日志原因分析

Apache Log4j 1.2.17 API

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