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的配置方式


<?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]