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