最近在搞一個項目架設,希望從構建一個項目方方面面都徹底研究透,增長實戰經驗。 今天先研究一下日志的構建,這里選擇了log4j--java方面比較流行的log框架,功能 很強大,使用起來也很方便了
廢話少說,先看看一個史上最簡單的log例子,看看我是如何用最簡潔的設計實現將異常 等信息寫入日志文件的。
項目源碼去的javaeye 博客下載 http://janeky.javaeye.com
項目文件結構 --------TestLog |----src | |-com/janeky/log/Log.java | |-log4j.properties |----bin | |-com/janeky/log/Log |----lib | |-log4j-1.2.11.jar
Eclipse新建一個java project TestLog 新建一個com.janeky.log包 導入log4j的jar包 包里新建一個Log.java
- package com.janeky.log;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PropertyConfigurator;
- /**
- * @author janeky
- * Log演示程序
- */
- publicclass Log {
- //Logger實例
- private Logger loger;
- //將Log類封裝成單實例的模式,獨立於其他類。以后要用到日志的地方只要獲得Log的實例就可以方便使用
- privatestatic Log log;
- //構造函數,用於初始化Logger配置需要的屬性
- private Log()
- {
- //獲得當前目錄路徑
- String filePath=this.getClass().getResource("/").getPath();
- //找到log4j.properties配置文件所在的目錄(已經創建好)
- filePath=filePath.substring(1).replace("bin", "src");
- //獲得日志類loger的實例
- loger=Logger.getLogger(this.getClass());
- //loger所需的配置文件路徑
- PropertyConfigurator.configure(filePath+"log4j.properties");
- }
- static Log getLoger()
- {
- if(log!=null)
- return log;
- else
- returnnew Log();
- }
- //測試函數
- publicstaticvoid main(String args[])
- {
- Log log=Log.getLoger();
- try
- {
- //引發異常
- int a=2/0;
- }catch(Exception e)
- {
- //控制台打印異常信息
- e.printStackTrace();
- //寫入到日子文件
- log.loger.error("error", e);
- }
- }
- }
- package com.janeky.log;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PropertyConfigurator;
- /**
- * @author janeky
- * Log演示程序
- */
- publicclass Log {
- //Logger實例
- private Logger loger;
- //將Log類封裝成單實例的模式,獨立於其他類。以后要用到日志的地方只要獲得Log的實例就可以方便使用
- privatestatic Log log;
- //構造函數,用於初始化Logger配置需要的屬性
- private Log()
- {
- //獲得當前目錄路徑
- String filePath=this.getClass().getResource("/").getPath();
- //找到log4j.properties配置文件所在的目錄(已經創建好)
- filePath=filePath.substring(1).replace("bin", "src");
- //獲得日志類loger的實例
- loger=Logger.getLogger(this.getClass());
- //loger所需的配置文件路徑
- PropertyConfigurator.configure(filePath+"log4j.properties");
- }
- static Log getLoger()
- {
- if(log!=null)
- return log;
- else
- returnnew Log();
- }
- //測試函數
- publicstaticvoid main(String args[])
- {
- Log log=Log.getLoger();
- try
- {
- //引發異常
- int a=2/0;
- }catch(Exception e)
- {
- //控制台打印異常信息
- e.printStackTrace();
- //寫入到日子文件
- log.loger.error("error", e);
- }
- }
- }
package com.janeky.log; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** * @author janeky * Log演示程序 */ public class Log { //Logger實例 private Logger loger; //將Log類封裝成單實例的模式,獨立於其他類。以后要用到日志的地方只要獲得Log的實例就可以方便使用 private static Log log; //構造函數,用於初始化Logger配置需要的屬性 private Log() { //獲得當前目錄路徑 String filePath=this.getClass().getResource("/").getPath(); //找到log4j.properties配置文件所在的目錄(已經創建好) filePath=filePath.substring(1).replace("bin", "src"); //獲得日志類loger的實例 loger=Logger.getLogger(this.getClass()); //loger所需的配置文件路徑 PropertyConfigurator.configure(filePath+"log4j.properties"); } static Log getLoger() { if(log!=null) return log; else return new Log(); } //測試函數 public static void main(String args[]) { Log log=Log.getLoger(); try { //引發異常 int a=2/0; }catch(Exception e) { //控制台打印異常信息 e.printStackTrace(); //寫入到日子文件 log.loger.error("error", e); } } }
在src文件夾中新建一個文本文檔 log4j.properties
- #定義DEBUG優先級,R為日志輸出目的的
- log4j.rootLogger=DEBUG, R
- #設置日志輸出類型,為文件類型
- log4j.appender.R=org.apache.log4j.FileAppender
- #設置日志文件名my.log
- log4j.appender.R.file=my.log
- #每次在文件尾寫入新的日志信息
- log4j.appender.R.Append=true
- #日志輸出信息格式類型
- log4j.appender.R.layout=org.apache.log4j.PatternLayout
- #日志輸出信息格式為 換行、換行、日期、優先級、[類名]、日志信息、換行
- log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n
- #定義DEBUG優先級,R為日志輸出目的的
- log4j.rootLogger=DEBUG, R
- #設置日志輸出類型,為文件類型
- log4j.appender.R=org.apache.log4j.FileAppender
- #設置日志文件名my.log
- log4j.appender.R.file=my.log
- #每次在文件尾寫入新的日志信息
- log4j.appender.R.Append=true
- #日志輸出信息格式類型
- log4j.appender.R.layout=org.apache.log4j.PatternLayout
- #日志輸出信息格式為 換行、換行、日期、優先級、[類名]、日志信息、換行
- log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n
#定義DEBUG優先級,R為日志輸出目的的 log4j.rootLogger=DEBUG, R #設置日志輸出類型,為文件類型 log4j.appender.R=org.apache.log4j.FileAppender #設置日志文件名my.log log4j.appender.R.file=my.log #每次在文件尾寫入新的日志信息 log4j.appender.R.Append=true #日志輸出信息格式類型 log4j.appender.R.layout=org.apache.log4j.PatternLayout #日志輸出信息格式為 換行、換行、日期、優先級、[類名]、日志信息、換行 log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n
運行吧,出錯了,恭喜你成功了,去TestLog目錄下尋找my.log日志信息吧
以后再任何需要記錄日志的地方只要使用下面語句就行了 Log log= Log.getLogger(); log.logger.error("something u like to record");
記錄日志就是這么簡單,不過你可以有其他的需要:
我要將日志發到郵箱 我要將日志寫到數據庫 我要每天的日志自動歸檔 ……
這些都可以通過修改配置log4j.properties配置文件來實現 以下是配置文件的語法
1. log4j.rootLogger = [level],appenderName,appenderName... 其中,level是日志記錄的優先級,從高到低分別為FATAL ERROR WARN INFO DEBUG 。當 你定義一個級別,只有等於或者高於這個基本的才進行處理。 可選的All打印所有日志,OFF 關閉所有日志輸出。 appenderName用於指定日志信息輸出目的地,可以指定多個
2.配置appender
類型有以下幾種 org.apache.log4j.jdbc.JDBCAppender 存入數據庫 org.apache.log4j.net.SMTPAppender 發送到指定郵箱 net.cybercorlin.util.logger.appender.IMAppender 自定義類型 org.apache.log4j.ConsoleAppender 控制台 org.apache.log4j.FileAppender 文件 org.apache.log4j.DailyRollingFileAppender 每天產生一個日志文件 org.apache.log4j.RollingFileAppender 文件達到指定大小的時候產生一個新的文件 org.apache.log4j.WriterAppender 將日志信息以流格式發送到任意指定的地方 *************可以參照文章后面從網上摘抄的例子************
3.配置日志信息格式Layout 有以下幾種 org.apache.log4j.HTMLLayout HTML表格形式 org.apache.log4j.PatternLayout 自定義的布局(下面將見到這么自定義配置) org.apache.log4j.SimpleLayout 只包含日志信息基本和信息的字符信息 org.apache.log4j.TTCCLayout 包括日志產生時間、線程、類別等信息
4.自定義的布局中用到的格式化日志信息 采用跟C語言中printf的方式,參數有 %m 輸出代碼中指定的信息 如 log.error("error") %p 輸出優先級 就是上面提到的DEBUG,INFO等 %c 輸出所在類的全名 %r 輸出自應用啟用到輸出該log信息耗費的時間(毫秒) %t 輸出產生該日子事件的線程名 %n 輸出換行符號 Windows平台為 "rn",unix平台“n" %d 輸出日志時間點 默認格式是ISO8601 可以自定義格式,比如%d{yyy MM dd hh:mm:ss,sss}
在程序中使用log4j 記住,很簡單,就兩步驟,相信我,沒錯的:)
1.導入包 import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator;
2.獲取log實例 Logger logger = Logger.getLogger