使用Log4j为项目配置日志输出应用详细总结及示例演示.
Log4j組件構(gòu)成
Log4j由三個(gè)重要的組件構(gòu)成:
1.日志信息的優(yōu)先級(jí)(Logger)
2.日志信息的輸出目的地(Appender)
3.日志信息的輸出格式(Layout)。
概要:
日志信息的優(yōu)先級(jí)從高到低有ERROR、WARN、INFO、DEBUG,分別用來(lái)指定這條日志信息的重要程度;
日志信息的輸出目的地指定了日志將打印到控制臺(tái)還是文件中;
而輸出格式則控制了日志信息的顯示內(nèi)容。
Log4j介紹
Log4j是Apache的一個(gè)開(kāi)放源代碼項(xiàng)目,通過(guò)使用Log4j,我們可以控制日志信息輸送的目的地是控制臺(tái)、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;我們也可以控制每一條日志的輸出格式,通過(guò)定義每一條日志信息的級(jí)別,我們能夠更加細(xì)致地控制日志的生成過(guò)程。log4j--log for java (java的日志) .
Log4j下載地址: http://logging.apache.org/log4j/2.x/download.html
Log4j配置文件的格式
Log4j支持兩種配置文件格式:
1. XML格式的文件
2. properties格式的文件
也可以完全不使用配置文件,而是在代碼中配置Log4j環(huán)境。但是,使用配置文件將使您的應(yīng)用程序更加靈活。
Log4j定義配置文件
1.配置根Logger
其語(yǔ)法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …參數(shù)說(shuō)明:
level是日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級(jí)別。
Off:最高等級(jí),用于關(guān)閉所有日志記錄
Fatal:指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會(huì)導(dǎo)致應(yīng)用程序的退出。
Error:指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
Warn:表明會(huì)出現(xiàn)潛在的錯(cuò)誤情形
Info:一般用在粗粒度級(jí)別上,強(qiáng)調(diào)應(yīng)用程序的運(yùn)行全程
Debug:一般和在粗粒度級(jí)別上,強(qiáng)調(diào)應(yīng)用程序的運(yùn)行全程。
All:最低等級(jí),用于打開(kāi)所有日志記錄。
Log4j建議只使用四個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG。通過(guò)在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開(kāi)關(guān)。
appenderName就是指日志信息輸出到哪個(gè)地方,可以同時(shí)指定多個(gè)輸出目的地。
2.配置日志信息輸出目的地Appender
其語(yǔ)法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 ... log4j.appender.appenderName.option = valueNLog4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺(tái))
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生新文件)
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
3.配置日志信息的格式
語(yǔ)法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueNLog4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
Log4J采用類似C語(yǔ)言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下:
%m輸出代碼中指定的消息
%p輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,FATAL
%r輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c輸出所屬的類目,通常就是所在類的全名
%t輸出產(chǎn)生該日志事件的線程名
%n輸出一個(gè)回車(chē)換行符,Windows平臺(tái)為“rn”,Unix平臺(tái)為“n”
%d輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyyMMMddHH:mm:ss,SSS},輸出類似:2002年10月18日22:10:28,921
%l輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)
%x:輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像javaservlets這樣的多客戶多線程的應(yīng)用中。
%%:輸出一個(gè)”%”字符 %F:輸出日志消息產(chǎn)生時(shí)所在的文件名稱
%L:輸出代碼中的行號(hào)
%m:輸出代碼中指定的消息,產(chǎn)生的日志具體信息
%n:輸出一個(gè)回車(chē)換行符,Windows平臺(tái)為”\r\n”,Unix平臺(tái)為”\n”輸出日志信息換行 可以在%與模式字符之間加上修飾符來(lái)控制其最小寬度、最大寬度、和文本的對(duì)齊方式。
如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對(duì)齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,”-”號(hào)指定左對(duì)齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于30字符,就從左邊交遠(yuǎn)銷(xiāo)出的字符截掉。
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導(dǎo)入到classpath中,并將log4j.properties放于src根目錄中。 在類中使用log4j,首先聲明一個(gè)靜態(tài)變量Loggerlogger=Logger.getLog("classname").現(xiàn)在就可以使用了。
用法如下:logger.debug("debugmessage")或者logger.info("infomessage").
1.得到記錄器
使用Log4j,第一步就是獲取日志記錄器,這個(gè)記錄器將負(fù)責(zé)控制日志信息。
其語(yǔ)法為:
publicstaticLoggergetLogger(Stringname)
通過(guò)指定的名字獲得記錄器,如果必要的話,則為這個(gè)名字創(chuàng)建一個(gè)新的記錄器。Name一般取本類的名字,比如:
staticLoggerlogger=Logger.getLogger(ServerWithLog4j.class.getName())
2.讀取配置文件
當(dāng)獲得了日志記錄器之后,第二步將配置Log4j環(huán)境,其語(yǔ)法為:
BasicConfigurator.configure():自動(dòng)快速地使用缺省Log4j環(huán)境。
PropertyConfigurator.configure(StringconfigFilename):讀取使用Java的特性文件編寫(xiě)的配置文件。
DOMConfigurator.configure(Stringfilename):讀取XML形式的配置文件。
3.插入記錄信息(格式化日志信息)
當(dāng)上兩個(gè)必要步驟執(zhí)行完畢,您就可以輕松地使用不同優(yōu)先級(jí)別的日志記錄語(yǔ)句插入到您想記錄日志的任何地方,語(yǔ)法如下:
Logger.debug(Objectmessage);
Logger.info(Objectmessage);
Logger.warn(Objectmessage);
Logger.error(Objectmessage);
程序演示
1.使用程序進(jìn)行日志信息輸出
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">發(fā)送郵件</a> 18 * 19 * @since : 1.0 創(chuàng)建時(shí)間: 2013-1-1 下午03:19:42 20 * 21 * @function: 通過(guò)代碼將日志輸出 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 //使用構(gòu)造依賴,創(chuàng)建對(duì)象時(shí)初始化 34 public Log4jPrintByCode(Layout layout, Level level,String distDir){ 35 36 BasicConfigurator.configure(); //使用默認(rèn)的配置信息,不需要寫(xiě)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); //設(shè)置日志輸出級(jí)別 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 }為了提高效率,我們可以在寫(xiě)日志前增加判斷:
// 記錄debug級(jí)別的信息 if (logger.isDebugEnabled()) {logger.debug("This is debug message from Dao."); }// 記錄info級(jí)別的信息 if (logger.isInfoEnabled()) {logger.info("This is info message from Dao."); }如果這個(gè)類作為基類,如J2EE中的BaseDao、BaseAction、BaseService等等,則我們可以將各層的日志信息分類輸出到各個(gè)文件。
2.Log4J將同一個(gè)日志信息輸出到多個(gè)目的地
應(yīng)用實(shí)例將日志信息同時(shí)輸出到控制臺(tái),文件和數(shù)據(jù)庫(kù)中.
創(chuàng)建數(shù)據(jù)庫(kù)與 表
/* 創(chuàng)建數(shù)據(jù)庫(kù) */ create database db_log4j;/* 切換數(shù)據(jù)庫(kù) */ use db_log4j;/* 日志信息表 */ create table tb_log(logId int not null auto_increment comment '流水號(hào)' ,createDate varchar(45) default null comment '日志生成時(shí)間' ,thread varchar(45) default null comment '當(dāng)前線程',level varchar(45) default null comment '當(dāng)前日志級(jí)別' ,class varchar(45) default null comment '生成日志的類',message varchar(245) default null comment '日志具體信息',primary key(logId) );配置文件log4j.properties
#定義3個(gè)輸出端 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輸出到哪個(gè)文件 log4j.appender.A2.File=./log/sysLog.log #定義A2輸出文件的最大長(zhǎng)度 log4j.appender.A2.MaxFileSize = 1KB #定義A2的備份文件數(shù) 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輸出到數(shù)據(jù)庫(kù) 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的布局和執(zhí)行的SQL語(yǔ)句 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測(cè)試代碼
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">發(fā)送郵件</a>* * @since : 1.0 創(chuàng)建時(shí)間: 2013-1-1 下午04:13:59* * @function: 通過(guò)配置文件控制日志信息輸出到多個(gè)目的端**/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下的話,參數(shù)應(yīng)為"bin/log4j.properties"或者"src/log4j.properties", 建議以bin為準(zhǔn)//以下信息將被打印輸出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");}}
轉(zhuǎn)載請(qǐng)注明出處[http://www.cnblogs.com/dennisit/archive/2013/01/01/2841603.html]
總結(jié)
以上是生活随笔為你收集整理的使用Log4j为项目配置日志输出应用详细总结及示例演示.的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 超硬核!数据库学霸笔记,考试/面试随便秒
- 下一篇: ios 不被遮挡 阴影_为何你没见到日环