注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%nlog4j.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”