使用Log4j為項目配置日志輸出應用詳細總結及示例演示.

Log4j組件構成

Log4j由三個重要的組件構成:

1.日志信息的優先級(Logger)

2.日志信息的輸出目的地(Appender)

3.日志信息的輸出格式(Layout)。

概要:

日志信息的優先級從高到低有ERROR、WARN、INFO、DEBUG,分別用來指定這條日志信息的重要程度;

日志信息的輸出目的地指定了日志將打印到控制臺還是文件中;

而輸出格式則控制了日志信息的顯示內容。

Log4j介紹

  Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式,通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。log4j--log for java (java的日志) .

Log4j下載地址: http://logging.apache.org/log4j/2.x/download.html

Log4j配置文件的格式

Log4j支持兩種配置文件格式:

1. XML格式的文件

2. properties格式的文件

也可以完全不使用配置文件,而是在代碼中配置Log4j環境。但是,使用配置文件將使您的應用程序更加靈活。

Log4j定義配置文件

1.配置根Logger

其語法為:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

參數說明:  

level是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。

Off:最高等級,用于關閉所有日志記錄

Fatal:指出每個嚴重的錯誤事件將會導致應用程序的退出。

Error:指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。

Warn:表明會出現潛在的錯誤情形

Info:一般用在粗粒度級別上,強調應用程序的運行全程

Debug:一般和在粗粒度級別上,強調應用程序的運行全程。

All:最低等級,用于打開所有日志記錄。

Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。

appenderName就是指日志信息輸出到哪個地方,可以同時指定多個輸出目的地。

2.配置日志信息輸出目的地Appender

其語法為:

復制代碼
log4j.appender.appenderName = fully.qualified.name.of.appender.class   log4j.appender.appenderName.option1 = value1   ...   log4j.appender.appenderName.option = valueN
復制代碼

Log4j提供的appender有以下幾種:

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

  org.apache.log4j.FileAppender(文件)

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

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

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

3.配置日志信息的格式

語法為:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下幾種:

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

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

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

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

Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:

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

%p輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL   

%r輸出自應用啟動到輸出該log信息耗費的毫秒數   

%c輸出所屬的類目,通常就是所在類的全名   

%t輸出產生該日志事件的線程名   

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

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

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

%x:輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像javaservlets這樣的多客戶多線程的應用中。

%%:輸出一個”%”字符 %F:輸出日志消息產生時所在的文件名稱

%L:輸出代碼中的行號

%m:輸出代碼中指定的消息,產生的日志具體信息

%n:輸出一個回車換行符,Windows平臺為”\r\n”,Unix平臺為”\n”輸出日志信息換行 可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。

如:

1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認的情況下右對齊。

2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,”-”號指定左對齊。

3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會將左邊多出的字符截掉,但小于30的話也不會有空格。

4)%20.30c:如果category的名稱小于20就補空格,并且右對齊,如果其名稱長于30字符,就從左邊交遠銷出的字符截掉。

log4j.xml的配置方式

View Code
復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="appender1"class="org.apache.log4j.RollingFileAppender"><param name="File" value="logfile08.html" /><param name="MaxFileSize" value="1MB" /><param name="MaxBackupIndex" value="5" /><layout class="org.apache.log4j.HTMLLayout"></layout></appender><root><level value="debug" /><appender-ref ref="appender1" /></root>
</log4j:configuration>
復制代碼

代碼中使用Log4j

  在程序中使用Log4j之前,首先要將commons-logging.jar和logging-log4j-1.2.9.jar導入到classpath中,并將log4j.properties放于src根目錄中。 在類中使用log4j,首先聲明一個靜態變量Loggerlogger=Logger.getLog("classname").現在就可以使用了。

用法如下:logger.debug("debugmessage")或者logger.info("infomessage").

1.得到記錄器

  使用Log4j,第一步就是獲取日志記錄器,這個記錄器將負責控制日志信息。

其語法為:

  publicstaticLoggergetLogger(Stringname)

  通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。Name一般取本類的名字,比如:

  staticLoggerlogger=Logger.getLogger(ServerWithLog4j.class.getName())

2.讀取配置文件

  當獲得了日志記錄器之后,第二步將配置Log4j環境,其語法為:

  BasicConfigurator.configure():自動快速地使用缺省Log4j環境。

  PropertyConfigurator.configure(StringconfigFilename):讀取使用Java的特性文件編寫的配置文件。

  DOMConfigurator.configure(Stringfilename):讀取XML形式的配置文件。

3.插入記錄信息(格式化日志信息)

  當上兩個必要步驟執行完畢,您就可以輕松地使用不同優先級別的日志記錄語句插入到您想記錄日志的任何地方,語法如下:

   Logger.debug(Objectmessage);

   Logger.info(Objectmessage);

   Logger.warn(Objectmessage);

   Logger.error(Objectmessage);

程序演示

1.使用程序進行日志信息輸出

復制代碼
 1 package org.demo.log4j.dennisit;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.commons.logging.impl.Log4JLogger;
 6 import org.apache.log4j.BasicConfigurator;
 7 import org.apache.log4j.FileAppender;
 8 import org.apache.log4j.Layout;
 9 import org.apache.log4j.Level;
10 import org.apache.log4j.Logger;
11 import org.apache.log4j.SimpleLayout;
12 
13 /**
14  *
15  *  @version : 1.1
16  *  
17  *  @author  : 蘇若年    <a href="mailto:DennisIT@163.com">發送郵件</a>
18  *    
19  *  @since      : 1.0        創建時間:    2013-1-1        下午03:19:42
20  *     
21  *  @function: 通過代碼將日志輸出
22  *
23  */
24 
25 public class Log4jPrintByCode {
26 
27     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);
28     
29     private Layout layout = new SimpleLayout();
30     private FileAppender fileAppender;
31     
32 
33     //使用構造依賴,創建對象時初始化
34     public Log4jPrintByCode(Layout layout, Level level,String distDir){
35         
36         BasicConfigurator.configure();        //使用默認的配置信息,不需要寫log4j.properties
37         
38         try {
39             init(layout,level, distDir);
40         } catch (Exception e) {
41             e.printStackTrace();
42         }
43         
44     }
45     
46     
47     public void init(Layout layout, Level level,String distDir) throws Exception{
48         
49         logger.setLevel(level);                //設置日志輸出級別
50         fileAppender = new FileAppender(layout,distDir,false);
51         logger.addAppender(fileAppender);    //添加輸出端
52         
53     }
54     
55     
56     public static void main(String[] args) {
57         
58         SimpleLayout layout = new SimpleLayout();
59         String logDir = "log4jcode.Log";
60         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);
61         
62         
63         //下面信息將被輸出
64         log4jCode.logger.info("log info print by log4j");
65         log4jCode.logger.warn("log warn print by log4j");
66         log4jCode.logger.error("log error print by log4j");
67         
68     }
69 
70 
71     public Layout getLayout() {
72         return layout;
73     }
74 
75     public void setLayout(Layout layout) {
76         this.layout = layout;
77     }
78 
79     public FileAppender getFileAppender() {
80         return fileAppender;
81     }
82 
83     public void setFileAppender(FileAppender fileAppender) {
84         this.fileAppender = fileAppender;
85     }
86     
87     
88     
89 }
復制代碼

為了提高效率,我們可以在寫日志前增加判斷:

復制代碼
// 記錄debug級別的信息
if (logger.isDebugEnabled()) {logger.debug("This is debug message from Dao.");
}// 記錄info級別的信息
if (logger.isInfoEnabled()) {logger.info("This is info message from Dao.");
}
復制代碼

如果這個類作為基類,如J2EE中的BaseDao、BaseAction、BaseService等等,則我們可以將各層的日志信息分類輸出到各個文件。

2.Log4J將同一個日志信息輸出到多個目的地

應用實例將日志信息同時輸出到控制臺,文件和數據庫中.

創建數據庫與 表

復制代碼
/* 創建數據庫 */ 
create database db_log4j;/* 切換數據庫 */
use  db_log4j;/* 日志信息表 */
create table tb_log(logId int not null auto_increment comment '流水號' ,createDate varchar(45) default null comment '日志生成時間' ,thread varchar(45) default null comment '當前線程',level varchar(45) default null comment '當前日志級別' ,class varchar(45) default null comment '生成日志的類',message varchar(245) default null comment '日志具體信息',primary key(logId)
);
復制代碼

配置文件log4j.properties

復制代碼
#定義3個輸出端
log4j.rootCategory=INFO,A1,A2,A3#定義A1輸出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定義A1的布局模式為PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定義A1的輸出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n#定義A2輸出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定義A2輸出到哪個文件
log4j.appender.A2.File=./log/sysLog.log
#定義A2輸出文件的最大長度
log4j.appender.A2.MaxFileSize = 1KB
#定義A2的備份文件數
log4j.appender.A2.MaxBackupIndex = 3
#定義A2的布局模式為PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定義A2的輸出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n#定義A3輸出到數據庫
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定義A3的布局和執行的SQL語句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')
復制代碼

Java測試代碼

復制代碼
package org.demo.log4j.dennisit;import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;/****  @version : 1.1*  *  @author  : 蘇若年    <a href="mailto:DennisIT@163.com">發送郵件</a>*    *  @since      : 1.0        創建時間:    2013-1-1        下午04:13:59*     *  @function: 通過配置文件控制日志信息輸出到多個目的端**/public class Log4jPrintByConfigure {private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);public static void main(String[] args) throws Exception {//加載log配置文件log4j.propertiesPropertyConfigurator.configure("configure/log4j.properties");//文件存放在src同目錄的configure文件夾下//如果放在src下的話,參數應為"bin/log4j.properties"或者"src/log4j.properties", 建議以bin為準//以下信息將被打印輸出logger.debug("logger print DEBUG messgae");logger.info("logger print INFO message");logger.warn("logger print WARN message");logger.error("logger print ERROR message");logger.fatal("Here is FATAL message");}}
復制代碼

轉載請注明出處[http://www.cnblogs.com/dennisit/archive/2013/01/01/2841603.html]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444411.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:27---new delete malloc free

上一節我講了new和delete,有人問這不是和C語言的malloc/free為C的標準庫函數差不多么 void* malloc(size_t size)//參數代表字節個數 void free(void* pointer)//參數代表內存地址new、delete則為C++的操作運算符,它調用的分別為賦值運算符重載operator new()和operator del…

C++:33---類成員指針

成員指針概述: 當初始化一個這樣的指針時,我們令其指向類的某個成員,但是不指定該成員所屬的對象直到使用成員指針時,才提供成員所屬的對象成員指針是指可以指向類的非靜態成員的指針一般情況下,指針指向一個對象,但是成員指針指向的是類的成員,而不是類的所創建出的對象…

C++:31---對象引用和賦值

一、對象移動概述 C++11標準引入了“對象移動”的概念對象移動的特性是:可以移動而非拷貝對象在C++舊標準中,沒有直接的方法移動對象。因此會有很多不必要的資源拷貝標準庫容器、string、share_ptr類既支持移動也支持拷貝。IO類和unique_ptr類可以移動但不能拷貝對象移動的特…

C++:34---union:聯合/共用體,一種節省空間的類

一、聯合(union)概述 聯合(union)是一種特殊的類一個union可以有多個數據成員,但是在任意時刻只有一個數據成員可以有值。當我們給union的某個成員賦值之后,該union的其它成員就變成未定義的狀態了。分配給一個union對象的存儲空間至少要能容納它的最大的數據成員類的某些…

leetcode205. 同構字符串 一般人一次做不對的簡單題

給定兩個字符串 s 和 t&#xff0c;判斷它們是否是同構的。 如果 s 中的字符可以被替換得到 t &#xff0c;那么這兩個字符串是同構的。 所有出現的字符都必須用另一個字符替換&#xff0c;同時保留字符的順序。兩個字符不能映射到同一個字符上&#xff0c;但字符可以映射自己…

C++:32---IO庫

一、IO庫 I0庫類型和頭文件頭文件類型iostreamistream,wistream從流讀取數據ostream,wostream向流寫入數據iostream,wiostream讀寫流fstreamifstream,wifstream從文件讀取數據ofstream,wofstream向文件寫入數據fstream,wfstream讀寫文件sstreamistringstream,wistringst

leetcode209. 長度最小的子數組 借這個題規范一下雙指針寫法

給定一個含有 n 個正整數的數組和一個正整數 s &#xff0c;找出該數組中滿足其和 ≥ s 的長度最小的連續子數組。如果不存在符合條件的連續子數組&#xff0c;返回 0。 示例: 輸入: s 7, nums [2,3,1,2,4,3] 輸出: 2 解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組…

C++(STL):01---pair容器

一、pair歷史概述 C++標準庫的第1版(C++98),提供了一個簡單的class,用來處理類型不同的兩個(一對)值,這個就是pair。到了C++11,pair被重新定義,有了很大擴展pair與tuple:tuple在TR1被引入,它是對pair的擴展tuple在后面詳細概述。二、pair概述 特點: 一個pair保存兩…

C++(STL):02---tuple容器

一、tuple的歷史概述 Tuple是TR1引入的東西,它擴展了pair的概念,擁有任意數量的元素。在C++11標準之前,tuple最多帶有10個類型不同的元素C++11,tuple被重新定義,采用variadic template概念,被設計為可用于任意大小的異質集合二、tuple概述 tuple與pair類似,也是一個模板…

C++(STL):06---數值的極值(numeric_limits類)

一、數值的極值概述 數值類型有著與平臺相依的極值C++標準規定了各種類型必須保證的最小精度。這些最小值如下圖所示: 類型最小長度char1byte(8bits)shortint2bytesint2byteslongint4bytes

leetocde 225. 用隊列實現棧

使用隊列實現棧的下列操作&#xff1a; push(x) -- 元素 x 入棧 pop() -- 移除棧頂元素 top() -- 獲取棧頂元素 empty() -- 返回棧是否為空 注意: 你只能使用隊列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 這些操作是合法的。 你所使用的語…

C++(STL):03---智能指針之shared_ptr

一、shared_ptr類 頭文件:#include<memory>智能指針,是一個模板。創建智能指針時,必須提供指針所指的類型如果當做前提條件判斷,則是檢測其是否為空shared_ptr<string> p1; //指向string shared_ptr<list<int>> p2;//指向int的list if(p1 &&…

C++(STL):05---智能指針之unique_ptr

一、unique_ptr類 頭文件:#include<memory>智能指針,是一個模板。創建智能指針時,必須提供指針所指的類型與shared_ptr的不同之處: shared_ptr所指向的對象可以有多個其他shared_ptr智能指針而unique_ptr所指向的對象只能有一個unique_ptr指針,也就是自己。當unique…

JAVA中int、String的類型轉換

int -> String int i12345; String s""; 第一種方法&#xff1a;si""; 第二種方法&#xff1a;sString.valueOf(i); 這兩種方法有什么區別呢&#xff1f;作用是不是一樣的呢&#xff1f;是不是在任何下都能互換呢&#xff1f; String -> int s"…

leetcode 231. 2的冪

給定一個整數&#xff0c;編寫一個函數來判斷它是否是 2 的冪次方。 示例 1: 輸入: 1 輸出: true 解釋: 20 1 示例 2: 輸入: 16 輸出: true 解釋: 24 16 示例 3: 輸入: 218 輸出: false 本題思路轉載位運算的常用技巧&#xff1a;lowbit運算&#xff0c;包含lowbit公式、…

C++(STL):04---智能指針之weak_ptr

一、概念weak_ptr是一種不控制所指向對象生存期的智能指針&#xff0c;它指向一個shared_ptr管理的對象擁有“弱”共享的特點最重要的特點一個對象被多個shared_ptr類所指向時&#xff0c;就會擁有多個引用計數但是當weak_ptr指向一個shared_ptr類所指向的對象時&#xff0c;該…

C語言: const關鍵字與指針

const修飾指針的4種形式 const關鍵字,在C語言中用來修飾變量,表示這個變量是常量。const修飾指針有4種形式,區分清楚這4種即可全部理解const和指針。第一種:const int *p;第二種:int const *p;第三種:int * const p;第四種:const int * const p;ation ‘*p4’ // 第一種…

leetcode268. 缺失數字

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列&#xff0c;找出 0 .. n 中沒有出現在序列中的那個數。 示例 1: 輸入: [3,0,1] 輸出: 2 示例 2: 輸入: [9,6,4,2,3,5,7,0,1] 輸出: 8 說明: 你的算法應具有線性時間復雜度。你能否僅使用額外常數空間來實現? 眾所周知&#…

C++(STL):07---vector之使用方式和常規用法

簡單兩三句話說下vector(一般領導講話都說簡單說兩句,結果說了一個鐘頭): 介紹 vector是表示可變大小數組的序列容器。就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是…

leetcode276. 柵欄涂色

有 k 種顏色的涂料和一個包含 n 個柵欄柱的柵欄&#xff0c;每個柵欄柱可以用其中一種顏色進行上色。 你需要給所有柵欄柱上色&#xff0c;并且保證其中相鄰的柵欄柱 最多連續兩個 顏色相同。然后&#xff0c;返回所有有效涂色的方案數。 注意: n 和 k 均為非負的整數。 示例…