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對象的獲得或建立:
Logger被指定為實體,由一個String類的名字識別。Logger的名字是大小寫敏感的,且名字之間具有繼承關係,子名用父名作為首碼,用點“.”分隔,例如x.y是x.y.z的父親。
root Logger(根Logger)是所有Logger的祖先,它有如下屬性:
1.它總是存在的。
2.它不可以通過名字獲得。
root Logger可以通過以下語句獲得:
public static Logger Logger.getRootLogger();
或:
public static Logger Logger.getLogger(Class clazz)
其中調用Logger.getLogger(Class clazz)是目前ogger對象最理想的方法。
B)記錄層級
每個Logger都被了一個記錄層級(log level),用來控制日誌資訊的輸出。記錄層級從高到低分為:
A:off 最高等級,用於關閉所有日誌記錄。
B:fatal 指出每個嚴重的錯誤事件將會導致應用程式的退出。
C:error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
D:warm 表明會出現潛在的錯誤情形。
E:info 一般和在粗粒度層級上,強調應用程式的運行全程。
F:debug 一般用於細粒度層級上,對調試應用程式非常有協助。
G:all 最低等級,用於開啟所有日誌記錄。
上面這些層級是定義在org.apache.log4j.Level類中。Log4j只建議使用4個層級,優先順序從高到低分別是error,warn,info和debug。通過使用記錄層級,可以控制應用程式中相應層級日誌資訊的輸出。例如,如果使用b了info層級,則應用程式中所有低於info層級的日誌資訊(如debug)將不會被列印出來。
package log4j;
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::org.apache.log4j.jdbc.JDBCAppender:通過JDBC把日誌資訊輸出到資料庫中。
日誌格式化器Layout
有三種:
HTMLLayout:格式化日誌輸出為HTML表格形式:如下
SimpleLayout:以一種非常簡單的方式格式化日誌輸出,它列印三項內容:層級-資訊
例:INFO - info
PatternLayout::根據指定的轉換模式格式化日誌輸出,或者如果沒有指定任何轉換模式,就使用預設的轉化模式格式。
下面的代碼實現了SimpleLayout和FileAppender的程式
public static void main(String[] args) {
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環境就是指配置root Logger,包括把Logger為哪個層級,為它增加哪些Appender,以及為這些Appender設定Layout,等等。因為所有其他的Logger都是root Logger的後代,所以它們都繼承了root Logger的性質。這些可以通過設定系統屬性的方法來隱式地完成,也可以在程式中調用XXXConfigurator.configure()方法來顯式地完成。有以下幾種方式來配置Log4j。
A:配置放在檔案裡,通過環境變數傳遞檔案名稱等資訊,利用Log4j預設的初始化過程解析並配置。
B:配置放在檔案裡,通過應用伺服器配置傳遞檔案甸等資訊,利用一個特定的Servlet來完成配置。
C:在程式中調用BasicConfigor.configure()方法。
D:配置放在檔案裡,通過命令列PropertyConfigurator.configure(args[])解析log4j.properties檔案並配置Log4j。
下面對BasicConfigurator.configure()方法和PropertyConfigurator.config()方法分別進行介紹。
BasicConfigurator.configure()方法:
它使用簡單的方法配置Log4j環境。這個方法完成的任務是:
1:用預設的方式建立PatternLayout對象p:
PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");
2:用p建立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對象時:
static Logger logger = Logger.getLogger(mycalss.class);
如果沒有調用BasicConfigurator.configure(),PropertyConfigurator.configure()或DOMConfigurator.configure()方法,Log4j會自動載入CLASSPATH下名為log4j.properties的設定檔。如果把此設定檔改為其他名字,例如my.properties,程式雖然仍能運行,但會報出不能正確初始化Log4j系統的提示。這時可以在程式中加上:
PropertyConfigurator.configure("classes/my.properties");
問題即可解決。