談到我們在Java程序中經常用的日志,Log4j應該是耳熟能詳了。這里先提下slf4j,英文全名是Simple Logging Facade for Java,直面意思是:Java的簡單日志門面。slf4j-api.jar,從這個名稱的字面意思可以看出,就是為日志工具提供嵌入程序的接口;而slf4j-log4j12.jar可以理解成就是日志底層接口的實現,類似於中間件,一邊對應底層的接口,一邊可以根據偏好接入不同的日志系統。log4j.jar就是我們說的日志系統了,當然java有很多開源的日志系統,感興趣的可以查一查,這里只說Log4j。
第一步:引入依賴
打開pom文件,在dependencies里添加下面這部分代碼
- <!-- ============== log begin ============== -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.25</version>
- </dependency>
- <!-- ============== log end ============== -->
然后更新項目,同時會引入如下三個有依賴關系的jar包
每個jar包的大致用途,上邊已經講了,接下來看看如何使用Log4j。
第二步:如何使用Log4j
Log4j本身支持兩種文件的配置方式,一種是XML文件,一種是properties文件,這里我們只說properties的方式,先創建一個log4j.properties的文件,寫入配置信息
- ### set log levels ###
- log4j.rootLogger = INFO, console, debugFile, errorFile
- ### 輸出到控制台 ###
- log4j.appender.console = org.apache.log4j.ConsoleAppender
- ##這個不指定默認是System.out,指定輸出控制台
- log4j.appender.console.Target = System.out
- ##輸出INFO級別以上的日志
- log4j.appender.console.Threshold = INFO
- ##布局模式,自己靈活指定
- log4j.appender.console.layout = org.apache.log4j.PatternLayout
- log4j.appender.console.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n
- ### 保存日志內容到具體文件 ###
- ##輸出到每天一個獨立文件
- log4j.appender.debugFile = org.apache.log4j.DailyRollingFileAppender
- ##輸出DEBUG級別以上的日志
- log4j.appender.debugFile.Threshold = DEBUG
- ##異常日志文件路徑,文件名稱方案
- log4j.appender.debugFile.File = D:/logs/log.log
- log4j.appender.debugFile.DatePattern = '.'yyyy-MM-dd-HH
- ##設定信息是增加而不是覆蓋
- log4j.appender.debugFile.Append=true
- #信息輸出格式
- log4j.appender.debugFile.layout = org.apache.log4j.PatternLayout
- log4j.appender.debugFile.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n
- ### 保存異常信息到具體文件 ###
- ##輸出到每天一個獨立文件
- log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender
- ##只輸出ERROR級別以上的日志內容
- log4j.appender.errorFile.Threshold = ERROR
- ##異常日志文件路徑,文件名稱方案
- log4j.appender.errorFile.File = D:/logs/error.log
- log4j.appender.errorFile.DatePattern = '.'yyyy-MM-dd-HH
- ##設定信息是增加而不是覆蓋
- log4j.appender.errorFile.Append=true
- #信息輸出格式
- log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout
- log4j.appender.errorFile.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n
對於上邊的代碼,這里講下Log4j簡單的使用重點
1.配置根Logger
- og4j.rootLogger = [ level ] , console, debugFile, errorFile
level指的是日志記錄的優先級,分為ALL、DEBUG、INFO、WARN、ERROR等或者自定義的級別,這個決定日志信息展示的信息顆粒密度和重要等級,如果后邊沒有做具體設置,這個將起到作用。console, debugFile等是設定日志信息輸出策略的名字。
2.配置日志信息輸出目的
- log4j.appender.console = org.apache.log4j.ConsoleAppender
這個參數是用來配置日志信息輸出在哪里,常用的有這幾個
- org.apache.log4j.ConsoleAppender(控制台顯示)
- org.apache.log4j.FileAppender(單一文件)
- org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
- org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
當然也可以通過郵件、連接數據庫等方式進行輸出,也可以進行自己定義,具體可以查下相關資料。
3.配置日志信息的布局
- log4j.appender.console.layout = org.apache.log4j.PatternLayout
這個參數是用來設置采取什么布局樣式,常用的有以下幾種
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以自己指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
我們一般都是采用PatternLayout的格式來自己定義日志信息格式。
4.輸出格式設置
- log4j.appender.console.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n
這個類似於C語言的格式化打印的腳本信息,常用的幾個如下
- %m 輸出代碼中指定的消息(這個就是我們在代碼中定義要打出的那部分)
- %n 輸出一個回車換行符(Windows平台為“\r\n”,Unix平台為“\n”)
- %p 輸出優先級(即DEBUG,INFO,WARN,ERROR,FATAL)
- %r 輸出自應用啟動到輸出該log信息耗費的毫秒數
- %c 輸出所屬的類目,通常就是所在類的全名
- %t 輸出產生該日志事件的線程名
- %d 輸出日志時間點的日期或時間(默認格式為ISO8601,也可以指定格式,如:%d{yyy MMM dd HH:mm:ss , SSS},或者直接%d{ABSOLUTE})
- %l 輸出日志事件的發生位置,包括類目名以及在代碼中的行數。(如:test.demo.controller.TestSpringController.getUser(TestSpringController.java:40))
類似不同的還有很多,就不一一列述。
此外,還有要注意的是Appender選項的Threshold設定,是用來配置當前策略日志消息的輸出最低層次的,還有一些選項,可以過后查查相關資料。
日志的配置信息搞定了之后,我們接下來就在程序里添加幾行代碼,如下
- package test.demo.controller;
- import javax.annotation.Resource;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
- import test.demo.dao.UserDAO;
- import test.demo.data.User;
- @Controller
- public class TestSpringController {
- private static final Logger logger = LoggerFactory.getLogger(TestSpringController.class);
- @Resource
- private UserDAO userDao;
- @ResponseBody
- @RequestMapping(value="/getUser/{userId}", method=RequestMethod.GET)
- public String getUser(@PathVariable Integer userId) {
- User user = userDao.getUserById(userId);
- logger.info("這個用戶的名字是:{},年齡是{}" , user.getName(), user.getAge());
- logger.error("這個只是個測試:{}" , user.getName());
- return user.getName() + " , Hello Controller!";
- }
- }
我們為了突出效果,此處只留了我們所需的代碼,OK,清理構建,打包部署,然后看看運行結果怎么樣。
第三步:運行結果
服務器啟動之后,我們可以看到,日志系統開始工作了,部分截圖如下
接着我們在瀏覽器輸入:http://localhost:8080/demo/getUser/1、http://localhost:8080/demo/getUser/2,回車然后就可以在控制台看到以下內容
- [framework][17:04:28,801-com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:785)][INFO]:{dataSource-1} inited
- [framework][17:04:28,972-test.demo.controller.TestSpringController.getUser(TestSpringController.java:27)][INFO]:這個用戶的名字是:tom,年齡是2
- [framework][17:04:28,972-test.demo.controller.TestSpringController.getUser(TestSpringController.java:28)][ERROR]:這個只是個測試:tom
- [framework][17:04:44,446-test.demo.controller.TestSpringController.getUser(TestSpringController.java:27)][INFO]:這個用戶的名字是:jerry,年齡是1
- [framework][17:04:44,446-test.demo.controller.TestSpringController.getUser(TestSpringController.java:28)][ERROR]:這個只是個測試:jerry
然后去D盤下的logs文件夾下,可看到這兩個日志文件已經生成
好了,到此為止,我們已經成功的在系統中添加了日志功能。