(转)Log4J使用笔记
Log4J是Apache的一個(gè)開放源代碼的項(xiàng)目。通過使用Log4J,程序員可以控制日志信息輸送的目的地,包括控制臺,文件,GUI組件和NT事件記錄器,也可以控制每一條日志的輸出格式,或通過定義每一條日志信息的級別,更加細(xì)致地控制日志的生成過程。下面的代碼是一個(gè)例子:
????//Log4J????public?void?log4jDemo()
????{
????????Logger?logger?=?Logger.getLogger(Test.class);
????????
????????FileReader?fr?=?null;
????????try
????????{
????????????fr?=?new?FileReader("info.txt");
????????????logger.info("?begin?read?file");
????????}
????????catch(FileNotFoundException?e)
????????{
????????????logger.error("file?not?found",e);
????????????try?{
????????????????fr.close();
????????????}?catch?(IOException?e1)?{
????????????????
????????????????logger.error("file?not?found",e1);
????????????}
????????}????????
????}
Log4j的組成:
Log4j由三個(gè)重要的組成構(gòu)成:日志記錄器(Loggers),輸出端(Appenders)和日志格式化器(Layout)。
Logger:控制要啟用或禁用哪些日志記錄語句,并對日志信息進(jìn)行級別限制:Appenders指定了日志將打印到控制臺還是文件中;而Layout則控制日志信息的顯示格式。
A).Logger對象的獲得或創(chuàng)建:
Logger被指定為實(shí)體,由一個(gè)String類的名字識別。Logger的名字是大小寫敏感的,且名字之間具有繼承關(guān)系,子名用父名作為前綴,用點(diǎn)“.”分隔,例如x.y是x.y.z的父親。
root Logger(根Logger)是所有Logger的祖先,它有如下屬性:
1.它總是存在的。
2.它不可以通過名字獲得。
root Logger可以通過以下語句獲得:
或:
public?static?Logger?Logger.getLogger(Class?clazz)其中調(diào)用Logger.getLogger(Class clazz)是目前ogger對象最理想的方法。
B)日志級別
每個(gè)Logger都被了一個(gè)日志級別(log level),用來控制日志信息的輸出。日志級別從高到低分為:
A:off??????? ?最高等級,用于關(guān)閉所有日志記錄。
B:fatal?????? 指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會導(dǎo)致應(yīng)用程序的退出。
C:error??????指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
D:warm?????表明會出現(xiàn)潛在的錯(cuò)誤情形。
E:info?????????一般和在粗粒度級別上,強(qiáng)調(diào)應(yīng)用程序的運(yùn)行全程。
F:debug?????一般用于細(xì)粒度級別上,對調(diào)試應(yīng)用程序非常有幫助。
G:all?????????? 最低等級,用于打開所有日志記錄。
上面這些級別是定義在org.apache.log4j.Level類中。Log4j只建議使用4個(gè)級別,優(yōu)先級從高到低分別是error,warn,info和debug。通過使用日志級別,可以控制應(yīng)用程序中相應(yīng)級別日志信息的輸出。例如,如果使用b了info級別,則應(yīng)用程序中所有低于info級別的日志信息(如debug)將不會被打印出來。
import?org.apache.log4j.BasicConfigurator;
import?org.apache.log4j.Level;
import?org.apache.log4j.Logger;
public?class?Log4jTest?{
????public?static?void?main(String[]?args)?{
????????
????????Logger?logger?=?Logger.getLogger(Log4jTest.class);
????????
????????//使用默認(rèn)的配置信息,不需要寫log4j.properties
????????BasicConfigurator.configure();
????????//設(shè)置日志輸出級別為info,這將覆蓋配置文件中設(shè)置的級別
????????logger.setLevel(Level.INFO);
????????//下面的消息將被輸出
????????logger.info("this?is?an?info");
????????logger.warn("this?is?a?warn");
????????logger.error("this?is?an?error");
????????logger.fatal("this?is?a?fatal");
????}
}
C)輸出端Appender
Appender用來指定日志信息輸出到哪個(gè)地方,可以同時(shí)指定多個(gè)輸出目的地。Log4j允許將信息輸出到許多不同的輸出設(shè)備中,一個(gè)log信息輸出目的地就叫做一個(gè)Appender。
每個(gè)Logger都可以擁有一個(gè)或多個(gè)Appender,每個(gè)Appender表示一個(gè)日志的輸出目的地。可以使用Logger.addAppender(Appender app)為Logger增加一個(gè)Appender,也可以使用Logger.removeAppender(Appender app)為Logger刪除一個(gè)Appender。
以下為Log4j幾種常用的輸出目的地。
a:org.apache.log4j.ConsoleAppender:將日志信息輸出到控制臺。
b:org.apache.log4j.FileAppender:將日志信息輸出到一個(gè)文件。
c:org.apache.log4j.DailyRollingFileAppender:將日志信息輸出到一個(gè)日志文件,并且每天輸出到一個(gè)新的日志文件。
d:org.apache.log4j.RollingFileAppender:將日志信息輸出到一個(gè)日志文件,并且指定文件的尺寸,當(dāng)文件大小達(dá)到指定尺寸時(shí),會自動把文件改名,同時(shí)產(chǎn)生一個(gè)新的文件。
e:org.apache.log4j.WriteAppender:將日志信息以流格式發(fā)送到任意指定地方。
f::org.apache.log4j.jdbc.JDBCAppender:通過JDBC把日志信息輸出到數(shù)據(jù)庫中。
?
日志格式化器Layout
有三種:
HTMLLayout:格式化日志輸出為HTML表格形式:如下
SimpleLayout:以一種非常簡單的方式格式化日志輸出,它打印三項(xiàng)內(nèi)容:級別-信息
例:INFO - info
PatternLayout::根據(jù)指定的轉(zhuǎn)換模式格式化日志輸出,或者如果沒有指定任何轉(zhuǎn)換模式,就使用默認(rèn)的轉(zhuǎn)化模式格式。
下面的代碼實(shí)現(xiàn)了SimpleLayout和FileAppender的程序
????????
????????Logger?logger?=?Logger.getLogger(Log4jTest.class);????????
????????SimpleLayout?layout?=?new?SimpleLayout();
????????//HTMLLayout??layout?=?new?HTMLLayout();
????????FileAppender?appender?=?null;
????????try
????????{
????????????//把輸出端配置到out.txt
????????????appender?=?new?FileAppender(layout,"out.txt",false);
????????}catch(Exception?e)
????????{????????????
????????}
????????logger.addAppender(appender);//添加輸出端
????????logger.setLevel((Level)Level.DEBUG);//覆蓋配置文件中的級別
????????logger.debug("debug");
????????logger.info("info");
????????logger.warn("warn");
????????logger.error("error");
????????logger.fatal("fatal");
????}
Log4j的配置
配置Log4j環(huán)境就是指配置root Logger,包括把Logger為哪個(gè)級別,為它增加哪些Appender,以及為這些Appender設(shè)置Layout,等等。因?yàn)樗衅渌腖ogger都是root Logger的后代,所以它們都繼承了root Logger的性質(zhì)。這些可以通過設(shè)置系統(tǒng)屬性的方法來隱式地完成,也可以在程序中調(diào)用XXXConfigurator.configure()方法來顯式地完成。有以下幾種方式來配置Log4j。
A:配置放在文件里,通過環(huán)境變量傳遞文件名等信息,利用Log4j默認(rèn)的初始化過程解析并配置。
B:配置放在文件里,通過應(yīng)用服務(wù)器配置傳遞文件甸等信息,利用一個(gè)特定的Servlet來完成配置。
C:在程序中調(diào)用BasicConfigor.configure()方法。
D:配置放在文件里,通過命令行PropertyConfigurator.configure(args[])解析log4j.properties文件并配置Log4j。
下面對BasicConfigurator.configure()方法和PropertyConfigurator.config()方法分別進(jìn)行介紹。
BasicConfigurator.configure()方法:
它使用簡單的方法配置Log4j環(huán)境。這個(gè)方法完成的任務(wù)是:
1:用默認(rèn)的方式創(chuàng)建PatternLayout對象p:
??PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");
2:用p創(chuàng)建ConsoleAppender對象a,目標(biāo)是System.out,標(biāo)準(zhǔn)輸出設(shè)備:
?ConsoleAppender a = new CpnsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
3:為root Logger增加一個(gè)ConsoleAppender p;
?rootLogger.addAppender(p);
4:把rootLogger的log level設(shè)置為DUBUG級別;
?rootLogger.setLevel(Level.DEBUG);
PropertyConfigurator.configure()方法:
當(dāng)使用以下語句生成Logger對象時(shí):
如果沒有調(diào)用BasicConfigurator.configure(),PropertyConfigurator.configure()或DOMConfigurator.configure()方法,Log4j會自動加載CLASSPATH下名為log4j.properties的配置文件。如果把此配置文件改為其他名字,例如my.properties,程序雖然仍能運(yùn)行,但會報(bào)出不能正確初始化Log4j系統(tǒng)的提示。這時(shí)可以在程序中加上:
PropertyConfigurator.configure("classes/my.properties");問題即可解決。
轉(zhuǎn)載于:https://www.cnblogs.com/whf-Staring/p/4434274.html
總結(jié)
以上是生活随笔為你收集整理的(转)Log4J使用笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: h5实现手机端等级进度条
- 下一篇: 发现个很有意思的angularjs +g