一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

log4j學(xué)習(xí)資料

 168一路發(fā) 2011-03-01

1.簡(jiǎn)介

程序開(kāi)發(fā)環(huán)境中的日志記錄是由嵌入在程序中以輸出一些對(duì)開(kāi)發(fā)人員有用信息的語(yǔ)句所組成。例如,跟蹤語(yǔ)句(trace),結(jié)構(gòu)轉(zhuǎn)儲(chǔ)和常見(jiàn)的 System.out.printlnprintf調(diào)試語(yǔ)句。log4j提供分級(jí)方法在程序中嵌入日志記錄語(yǔ)句。日志信息具有多種輸出格式和多個(gè)輸出級(jí)別。

 

使用一個(gè)專(zhuān)門(mén)的日志記錄包,可以減輕對(duì)成千上萬(wàn)的System.out.println語(yǔ)句的維護(hù)成本,因?yàn)槿罩居涗浛梢酝ㄟ^(guò)配置腳本在運(yùn)行時(shí)得以控制。 log4j維護(hù)嵌入在程序代碼中的日志記錄語(yǔ)句。通過(guò)規(guī)范日志記錄的處理過(guò)程,一些人認(rèn)為應(yīng)該鼓勵(lì)更多的使用日志記錄并且獲得更高程度的效率。

 

2.安裝

為了使用我們即將要安裝的日志記錄工具,還必須要設(shè)置操作環(huán)境,只有這樣,工具才能知道從哪里找到它所需要的信息,并且操作系統(tǒng)知道從哪里找到這個(gè)工具。那么,怎樣做呢?實(shí)際上,它要求更改操作環(huán)境。

 

http://jakarta./log4j/docs/download.html下載log4j發(fā)行版。

 

解壓存檔文件到合適的目錄中。

 

添加文件 dist/lib/log4j-1.2.6.jar CLASSPATH 環(huán)境變量中。

 

3.log4j的基本概念

使用log4j大概涉及3個(gè)主要概念:

 

公共類(lèi) Logger

 

Logger 負(fù)責(zé)處理日志記錄的大部分操作。

 

公共接口 Appender

 

Appender 負(fù)責(zé)控制日志記錄操作的輸出。

 

公共抽象類(lèi)Layout

 

Layout 負(fù)責(zé)格式化Appender的輸出。

Log4j的類(lèi)圖

3.1.Logger

日志記錄器(Logger)是日志處理的核心組件。log4j具有5種正常級(jí)別(Level) 日志記錄器(Logger)的可用級(jí)別Level (不包括自定義級(jí)別 Level), 以下內(nèi)容就是摘自log4j API (http://jakarta./log4j/docs/api/index.html):

 

static Level DEBUG

 

DEBUG Level指出細(xì)粒度信息事件對(duì)調(diào)試應(yīng)用程序是非常有幫助的。

 

static Level INFO

 

INFO level表明 消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過(guò)程。

 

static Level WARN

 

WARN level表明會(huì)出現(xiàn)潛在錯(cuò)誤的情形。

 

static Level ERROR

 

ERROR level指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。

 

static Level FATAL

 

FATAL level指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會(huì)導(dǎo)致應(yīng)用程序的退出。

 

另外,還有兩個(gè)可用的特別的日志記錄級(jí)別: (以下描述來(lái)自log4j API http://jakarta./log4j/docs/api/index.html):

 

static Level ALL

 

ALL Level是最低等級(jí)的,用于打開(kāi)所有日志記錄。

 

static Level OFF

 

OFF Level是最高等級(jí)的,用于關(guān)閉所有日志記錄。

 

日志記錄器(Logger)的行為是分等級(jí)的。

 

 

日志記錄器(Logger)將只輸出那些級(jí)別高于或等于它的級(jí)別的信息。如果沒(méi)有設(shè)置日志記錄器(Logger)的級(jí)別,那么它將會(huì)繼承最近的祖先的級(jí)別。因此,如果在包com.foo.bar中創(chuàng)建一個(gè)日志記錄器(Logger)并且沒(méi)有設(shè)置級(jí)別,那它將會(huì)繼承在包com.foo中創(chuàng)建的日志記錄器(Logger)的級(jí)別。如果在com.foo中沒(méi)有創(chuàng)建日志記錄器(Logger)的話,那么在com.foo.bar中創(chuàng)建的日志記錄器(Logger)將繼承root 日志記錄器(Logger)的級(jí)別,root日志記錄器(Logger)經(jīng)常被實(shí)例化而可用,它的級(jí)別為DEBUG。

 

有很多方法可以創(chuàng)建一個(gè)日志記錄器(Logger),下面方法可以取回root日志記錄器:

 

Logger logger = Logger.getRootLogger();

 

 

還可以這樣創(chuàng)建一個(gè)新的日志記錄器:

 

Logger logger = Logger.getLogger("MyLogger");

 

 

比較常用的用法,就是根據(jù)類(lèi)名實(shí)例化一個(gè)靜態(tài)的全局日志記錄器:

 

static Logger logger = Logger.getLogger(test.class);

 

 

所有這些創(chuàng)建的叫"logger"的日志記錄器都可以用下面方法設(shè)置級(jí)別:

 

logger.setLevel((Level)Level.WARN);

 

 

可以使用7個(gè)級(jí)別中的任何一個(gè); Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.ALL and Level.OFF.

 

3.2.Appender

Appender 控制日志怎樣輸出。下面列出一些可用的Appender(log4j API中所描述的 http://jakarta./log4j/docs/api/index.html):

 

ConsoleAppender:使用用戶指定的布局(layout) 輸出日志事件到System.out或者 System.err。默認(rèn)的目標(biāo)是System.out。

 

DailyRollingFileAppender 擴(kuò)展FileAppender,因此多個(gè)日志文件可以以一個(gè)用戶選定的頻率進(jìn)行循環(huán)日志記錄。

 

FileAppender 把日志事件寫(xiě)入一個(gè)文件

 

RollingFileAppender 擴(kuò)展FileAppender備份容量達(dá)到一定大小的日志文件。

 

WriterAppender根據(jù)用戶的選擇把日志事件寫(xiě)入到Writer或者OutputStream。

 

SMTPAppender 當(dāng)特定的日志事件發(fā)生時(shí),一般是指發(fā)生錯(cuò)誤或者重大錯(cuò)誤時(shí),發(fā)送一封郵件。

 

SocketAppender 給遠(yuǎn)程日志服務(wù)器(通常是網(wǎng)絡(luò)套接字節(jié)點(diǎn))發(fā)送日志事件(LoggingEvent)對(duì)象。

 

SocketHubAppender 給遠(yuǎn)程日志服務(wù)器群組(通常是網(wǎng)絡(luò)套接字節(jié)點(diǎn))發(fā)送日志事件(LoggingEvent)對(duì)象。

 

SyslogAppender給遠(yuǎn)程異步日志記錄的后臺(tái)精靈程序(daemon)發(fā)送消息。

 

TelnetAppender 一個(gè)專(zhuān)用于向只讀網(wǎng)絡(luò)套接字發(fā)送消息的log4j appender。

 

還可以實(shí)現(xiàn) Appender 接口,創(chuàng)建以自己的方式進(jìn)行日志輸出的Appender

 

3.2.1.使用ConsoleAppender

ConsoleAppender可以用這種方式創(chuàng)建:

 

ConsoleAppender appender = new ConsoleAppender(new PatternLayout());

 

 

創(chuàng)建了一個(gè)控制臺(tái)appender,具有一個(gè)默認(rèn)的PatternLayout。它使用了默認(rèn)的System.out 輸出。

 

3.2.2.使用FileAppender

FileAppender可以用這種方式創(chuàng)建:

 

FileAppender appender = null;

try {

   appender = new FileAppender(new PatternLayout(),"filename");

} catch(Exception e) {}

 

 

上面用到的構(gòu)造函數(shù):

 

FileAppender(Layout layout, String filename)

實(shí)例化一個(gè)FileAppender并且打開(kāi)變量"filename"指定的文件。   

 

 

另一個(gè)有用的構(gòu)造函數(shù)是:

 

FileAppender(Layout layout, String filename, boolean append)

實(shí)例化一個(gè)FileAppender并且打開(kāi)變量"filename"指定的文件。   

 

 

這個(gè)構(gòu)造函數(shù)還可以選擇是否對(duì)指定的文件進(jìn)行追加的方式輸出。如果沒(méi)有指定值,那么默認(rèn)的方式就是追加。

 

3.2.3.使用WriterAppender

WriterAppender可以用這種方式創(chuàng)建:

 

WriterAppender appender = null;

try {

 appender = new WriterAppender(new PatternLayout(),new FileOutputStream("filename"));

} catch(Exception e) {}   

 

 

這個(gè)WriterAppender使用的構(gòu)造函數(shù)帶有PatternLayoutOutputStream參數(shù),在這種情況下, FileOutputStream用于向一個(gè)文件輸出。當(dāng)然,它還具有其他可用的構(gòu)造函數(shù)。

 

3.3.Layout

Appender必須使用一個(gè)與之相關(guān)聯(lián)的 Layout,這樣它才能知道怎樣格式化它的輸出。當(dāng)前,log4j具有三種類(lèi)型的Layout:

 

HTMLLayout 格式化日志輸出為HTML表格。

 

PatternLayout 根據(jù)指定的 轉(zhuǎn)換模式格式化日志輸出,或者如果沒(méi)有指定任何轉(zhuǎn)換模式,就使用默認(rèn)的轉(zhuǎn)換模式。

 

SimpleLayout 以一種非常簡(jiǎn)單的方式格式化日志輸出,它打印級(jí)別 Level,然后跟著一個(gè)破折號(hào)“- ,最后才是日志消息。

 

3.4.基本示例

3.4.1.SimpleLayout FileAppender

這里是一個(gè)非常簡(jiǎn)單的例子,程序?qū)崿F(xiàn)了SimpleLayoutFileAppender:

 

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.SimpleLayout;

import org.apache.log4j.FileAppender;

public class simpandfile { 

 static Logger logger = Logger.getLogger(simpandfile.class);

 public static void main(String args[]) {

    SimpleLayout layout = new SimpleLayout();

    FileAppender appender = null;

    try {

       appender = new FileAppender(layout,"output1.txt",false);

    } catch(Exception e) {}

    logger.addAppender(appender);

    logger.setLevel((Level) Level.DEBUG);

    logger.debug("Here is some DEBUG");

    logger.info("Here is some INFO");

    logger.warn("Here is some WARN");

    logger.error("Here is some ERROR");

    logger.fatal("Here is some FATAL"); 

   }

}   

 

 

你可以下載: simpandfile.java。 還可以查看它的輸出: output1.txt.

 

3.4.2.HTMLLayout WriterAppender

這里是一個(gè)非常簡(jiǎn)單的例子,程序?qū)崿F(xiàn)了 HTMLLayoutWriterAppender:

 

import java.io.*;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.HTMLLayout;

import org.apache.log4j.WriterAppender;

public class htmlandwrite {

 static Logger logger = Logger.getLogger(htmlandwrite.class);

 public static void main(String args[]) {

   HTMLLayout layout = new HTMLLayout();

   WriterAppender appender = null;

   try {

     FileOutputStream output = new FileOutputStream("output2.html");

     appender = new WriterAppender(layout,output);

   } catch(Exception e) {}

   logger.addAppender(appender);

   logger.setLevel((Level) Level.DEBUG);

   logger.debug("Here is some DEBUG");

   logger.info("Here is some INFO");

   logger.warn("Here is some WARN");

   logger.error("Here is some ERROR");

   logger.fatal("Here is some FATAL"); 

 }

}   

 

 

你可以下載: simpandfile.java. 還可以查看它的輸出:output1.txt.

 

3.4.3.PatternLayout ConsoleAppender

這里是一個(gè)非常簡(jiǎn)單的例子,程序?qū)崿F(xiàn)了PatternLayoutConsoleAppender:

 

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.PatternLayout;

import org.apache.log4j.ConsoleAppender;

public class consandpatt {

 static Logger logger = Logger.getLogger(consandpatt.class);

 public static void main(String args[]) {

   // Note, %n is newline

   String pattern = "Milliseconds since program start: %r %n";

   pattern += "Classname of caller: %C %n";

   pattern += "Date in ISO8601 format: %d{ISO8601} %n";

   pattern += "Location of log event: %l %n";

   pattern += "Message: %m %n %n";

   PatternLayout layout = new PatternLayout(pattern);

   ConsoleAppender appender = new ConsoleAppender(layout);

   logger.addAppender(appender);

   logger.setLevel((Level) Level.DEBUG);

   logger.debug("Here is some DEBUG");

   logger.info("Here is some INFO");

   logger.warn("Here is some WARN");

   logger.error("Here is some ERROR");

   logger.fatal("Here is some FATAL");

 }

}   

 

 

你可以下載:simpandfile.java. 還可以查看它的輸出: output2.txt.

 

4.使用外部配置文件

Log4j經(jīng)常與外部日志文件聯(lián)合使用,這樣很多可選項(xiàng)不必硬編碼在軟件中。使用外部配置文件的優(yōu)點(diǎn)就是修改可選項(xiàng)不需要重新編譯程序。唯一的缺點(diǎn)就是,由于用到io 指令,速度稍微有些減慢。

 

有兩個(gè)方法可以用來(lái)指定外部配置文件:文本文件或者XML文件。既然現(xiàn)在所有事情都寫(xiě)成XML文件,那么該教程就重點(diǎn)講解XML文件方法,但是也包含相關(guān)文本文件的例子。首先,看看下面的XML配置文件示例:

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta./log4j/">

 <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">

   <layout class="org.apache.log4j.SimpleLayout"/>

 </appender>

 <root>

   <priority value ="debug" />

   <appender-ref ref="ConsoleAppender"/>

 </root>

</log4j:configuration>  

 

 

文件以標(biāo)準(zhǔn)的XML聲明作為開(kāi)始,后面跟著指出DTD(文檔類(lèi)型定義)的DOCTYPE聲明,它定義了XML文件的結(jié)構(gòu),例如,什么元素可以嵌入在其他元素中等等。上面文件在log4j發(fā)行版的src/java/org/apache/log4j/xml目錄中。 接著看看封裝所有元素的 log4j:configuration 元素,它在DOCTYPE聲明中被指定為根元素。嵌入在根元素中有兩個(gè)結(jié)構(gòu):

 

<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">

 <layout class="org.apache.log4j.SimpleLayout"/>

</appender>    

 

 

這里創(chuàng)建一個(gè)名叫"ConsoleAppender" Appender,注意,你可以選擇任何名字,該示例之所以選擇"ConsoleAppender",完全是為了示例的設(shè)計(jì)。接著這個(gè)appender類(lèi)以全名形式給出,經(jīng)常用規(guī)范(fully qualified)類(lèi)名。 Appender必須具有一個(gè)指定的 nameclass。嵌入在 Appender之內(nèi)的是 layout元素,這里它被指定為SimpleLayout Layout 必須具有一個(gè) class屬性。

 

<root>

 <priority value ="debug" />

 <appender-ref ref="ConsoleAppender"/>

</root>    

 

 

root元素必須存在且不能被子類(lèi)化。示例中的優(yōu)先級(jí)被設(shè)置為"debug",設(shè)置appender飽含一個(gè)appender-ref元素。還有更多的屬性或元素可以指定。查看log4j發(fā)行版中的src/java/org/apache/log4j/xml/log4j.dtd以了解關(guān)于XML配置文件結(jié)構(gòu)的更多信息??梢杂孟旅孢@種方法把配置信息文件讀入到Java程序中:

 

DOMConfigurator.configure("configurationfile.xml"); 

 

 

DOMConfigurator 用一棵DOM樹(shù)來(lái)初始化log4j環(huán)境。這里是示例中的XML配置文件:plainlog4jconfig.xml。這里是執(zhí)行該配置文件的程序: files/externalxmltest.java:

 

import org.apache.log4j.Logger;

import org.apache.log4j.xml.DOMConfigurator;

public class externalxmltest {

 static Logger logger = Logger.getLogger(filetest.class);

 public static void main(String args[]) {

   DOMConfigurator.configure("xmllog4jconfig.xml");

   logger.debug("Here is some DEBUG");

   logger.info("Here is some INFO");

   logger.warn("Here is some WARN");

   logger.error("Here is some ERROR");

   logger.fatal("Here is some FATAL");

 }

 

 

這里是一個(gè)實(shí)現(xiàn)帶有PatternLayoutFileAppender的日志記錄器LoggerXML配置文件:

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta./log4j/">

<appender name="appender" class="org.apache.log4j.FileAppender">

 <param name="File" value="Indentify-Log.txt"/>

 <param name="Append" value="false"/>

 <layout class="org.apache.log4j.PatternLayout">

   <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>

 </layout>

</appender>

<root>

 <priority value ="debug"/>

 <appender-ref ref="appender"/>

</root>

</log4j:configuration> 

 

 

你可以從這里下載示例: xmllog4jconfig2.xml。 想要得到更多的使用XML文件配置log4j環(huán)境的例子,請(qǐng)查看log4j發(fā)行版的目錄src/java/org/apache/log4j/xml/examples/

 

這就是上面討論的文本文件形式的配置文件:

 

# initialise root logger with level DEBUG and call it BLAHlog4j.rootLogger=DEBUG,

BLAH# add a ConsoleAppender to the logger BLAHlog4j.appender.BLAH=

org.apache.log4j.ConsoleAppender# set set that layout to be SimpleLayoutlog4j.appender.BLAH.layout=

org.apache.log4j.SimpleLayout 

 

 

從這里可以下載: plainlog4jconfig.txt。這就是執(zhí)行該配置文件的程序:

 

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

public class externalplaintest {

 static Logger logger = Logger.getLogger(externalplaintest.class);

 public static void main(String args[]) {

   PropertyConfigurator.configure("plainlog4jconfig.xml");

   logger.debug("Here is some DEBUG");

   logger.info("Here is some INFO");

   logger.warn("Here is some WARN");

   logger.error("Here is some ERROR");

   logger.fatal("Here is some FATAL");

 }

 

 

你可以下載使用該配置文件的示例: externalplaintest.java。想要獲得更多的使用文本文件配置log4j環(huán)境的例子,請(qǐng)查看log4j發(fā)行版中的目錄examples。

 

使用外部配置文件的例子就簡(jiǎn)單的討論到這里,現(xiàn)在應(yīng)該可以肯定你已經(jīng)有能力獨(dú)立學(xué)習(xí)更多的log4j發(fā)行版和測(cè)試版中提供的例子。

 

5.參考資料 (以及一些有參考價(jià)值的鏈接)

http://jakarta./log4j/docs/manual.html

 

log4j的簡(jiǎn)明介紹 - Ceki G- 20023

 

http://www./htdocs/log4jhelp.html

 

不要用System.out.println!用Log4j - Vipan Singla

 

給你的Java應(yīng)用程序添加日志記錄 - Kevin Brown

 

  • Logger - 日志寫(xiě)出器,供程序員輸出日志信息
  • Appender - 日志目的地,把格式化好的日志信息輸出到指定的地方去
    • ConsoleAppender - 目的地為控制臺(tái)的Appender
    • FileAppender - 目的地為文件的Appender
    • RollingFileAppender - 目的地為大小受限的文件的Appender
  • Layout - 日志格式化器,用來(lái)把程序員的logging request格式化成字符串
    • PatternLayout - 用指定的pattern格式化logging requestLayout

Logger:日志寫(xiě)出器

Logger對(duì)象是用來(lái)取代System.out或者System.err的日志寫(xiě)出器,用來(lái)供程序員輸出日志信息。

Logger的輸出方法

Logger類(lèi)對(duì)象提供一系列方法供程序員輸出日志信息:

  • public void debug(Object msg);
  • public void debug(Object msg, Throwable t);
  • public void info(Object msg);
  • public void info(Object msg, Throwable t);
  • public void warn(Object msg);
  • public void warn(Object msg, Throwable t);
  • public void error(Object msg);
  • public void error(Object msg, Throwable t);
  • public void fatal(Object msg);
  • public void fatal(Object msg, Throwable t);

Logger的命名規(guī)則

Logger由一個(gè)String類(lèi)的名字識(shí)別,logger的名字是大小寫(xiě)敏感的,且名字之間具有繼承的關(guān)系,子名有父名作為前綴,用點(diǎn)號(hào).分隔。如:x.yx.y.z的父親。

logger (root logger)是所有logger的祖先,它具有如下屬性:1) 它總是存在的;2) 它不可以通過(guò)名字獲得。

通過(guò)調(diào)用public static Logger Logger.getRootLogger()獲得root logger;通過(guò)調(diào)用public static Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)獲得(或者創(chuàng)建)一個(gè)named logger。后者相當(dāng)于調(diào)用Logger.getLogger(clazz.getName())。

在某對(duì)象中,用該對(duì)象所屬的類(lèi)為參數(shù),調(diào)用Logger.getLogger(Class clazz)以獲得logger被認(rèn)為是目前所知的最理智的命名logger的方法。

Log level

每個(gè)logger都被分配了一個(gè)日志級(jí)別 (log level),用來(lái)控制日志信息的輸出。未被分配levellogger將繼承它最近的父loggerlevel。

每條輸出到logger的日志請(qǐng)求(logging request)也都有一個(gè)level,如果該requestlevel大于等于該loggerlevel,則該request將被處理(稱為enabled);否則該request將被忽略。故可得知:

  • loggerlevel越低,表示該logger越詳細(xì)
  • logging requestlevel越高,表示該logging request越優(yōu)先輸出

Level類(lèi)中預(yù)定義了五個(gè)level,它們的大小關(guān)系如下:

Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF
          

示例代碼

以下代碼將用自己所屬的類(lèi)為參數(shù),創(chuàng)建一個(gè)logger,啟用默認(rèn)配置,設(shè)置其level并向其輸出若干logging request。

import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
 
public class Log4jTest {
    public static void main(String argv[]) {
    
        // Create a logger by the name of class Log4jTest.
        Logger logger = Logger.getLogger(Log4jTest.class);
 
        // Use the default configuration.
        BasicConfigurator.configure();
 
        // Set the logger level to Level.INFO
        logger.setLevel(Level.INFO);
 
        // This request will be disabled since Level.DEBUG < Level.INFO.
        logger.debug("This is debug.");
 
        // These requests will be enabled.
        logger.info("This is an info.");
        logger.warn("This is a warning.");
        logger.error("This is an error.");
        logger.fatal("This is a fatal error.");
        
        return;
    }
}
          

關(guān)于logger的兩點(diǎn)說(shuō)明

  • 用同名參數(shù)調(diào)用Logger.getLogger(String name)將返回同一個(gè)logger的引用。故可以在一個(gè)地方配置logger,在另外一個(gè)地方獲得配置好的logger,而無(wú)須相互間傳遞logger的引用。
  • logger的創(chuàng)建可以按照任意的順序,即,父logger可以后于子logger被創(chuàng)建。log4j將自動(dòng)維護(hù)logger的繼承樹(shù)。

Appender:日志目的地

每個(gè)logger都可以擁有一個(gè)或者多個(gè)appender,每個(gè)appender表示一個(gè)日志的輸出目的地,比如console或者某個(gè)文件。可以使用Logger.addAppender(Appender app)logger增加一個(gè)appender;可以使用Logger.removeAppender(Appender app)logger移除一個(gè)appender。

默認(rèn)情況下,loggeradditive標(biāo)志被設(shè)置為true,表示子logger將繼承父logger的所有appenders。該選項(xiàng)可以被重新設(shè)置,表示子logger將不再繼承父loggerappenders。

root logger擁有目標(biāo)為system.outconsoleAppender,故默認(rèn)情況下,所有的logger都將繼承該appender。

// Log4j APIs : class Logger
      
// 為logger對(duì)象增加或者移除一個(gè)Appender對(duì)象
public void appAppender(Appender app);
public void removeAppender(Appender app);
 
// 獲得和設(shè)置additive標(biāo)志:是否繼承父logger的appenders
// 注意:在設(shè)置additive標(biāo)志為false時(shí),必須保證已經(jīng)為該logger設(shè)置了新的appender,
// 否則log4j將報(bào)錯(cuò):log4j:WARN No appenders could be found for logger (x.y.z).
public boolean getAdditivity();
public void setAdditivity(boolean additive);
        

ConsoleAppender

可以使用ConsoleAppender對(duì)象把日志輸出到控制臺(tái)。每個(gè)ConsoleAppender都有一個(gè)target,表示它的輸出目的地。它可以是System.out,標(biāo)準(zhǔn)輸出設(shè)備(緩沖顯示屏);或者是System.err,標(biāo)準(zhǔn)錯(cuò)誤設(shè)備(不緩沖顯示屏)。ConsoleAppender的使用方法參考如下API

// Log4j APIs : class ConsoleAppender extends WriterAppender
      
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象構(gòu)造一個(gè)ConsoleAppender對(duì)象 
// 默認(rèn)情況下,ConsoleAppender的target是System.out 
public ConsoleAppender(Layout layout);
 
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象和一個(gè)target字符串構(gòu)造ConsoleAppender對(duì)象 
// target的可能取值為ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR 
public ConsoleAppender(Layout layout, String target);
          

FileAppender

可以使用FileAppender對(duì)象把日志輸出到一個(gè)指定的日志文件中去。使用方法可以參考如下的API

// Log4j APIs : class FileAppender extends WriterAppender
      
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象和日志文件名構(gòu)造一個(gè)FileAppender對(duì)象 
public FileAppender(Layout layout, String filename)
throws IOException;
public FileAppender(Layout layout, String filename, boolean append)
throws IOException;
          

RollingFileAppender

可以使用FileAppender的子類(lèi)RollingFileAppender對(duì)象,把日志輸出到一個(gè)指定的日志文件中。不同的是該日志文件的大小受到限制,當(dāng)日志內(nèi)容超出最大的尺寸時(shí),該文件將向上滾動(dòng)(最老的日志被擦除)。還可以在該類(lèi)對(duì)象中指定為日志文件做多少個(gè)備份。具體使用方法參考如下API

// Log4j APIs : class RollingFileAppender extends FileAppender
      
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象和日志文件名構(gòu)造一個(gè)RollingFileAppender對(duì)象 
public RollingFileAppender(Layout layout, String filename)
throws IOException;
public RollingFileAppender(Layout layout, String filename, boolean append)
throws IOException;
 
// 獲得和設(shè)置日志備份文件的個(gè)數(shù) 
public int getMaxBackupIndex();
public void setMaxBackupIndex(int index);
 
// 獲得和設(shè)置滾動(dòng)日志文件的最大尺寸 
public long getMaximumFileSize();
public void setMaximumFileSize(long size);
          

Layout:日志格式化器

每個(gè)appender都和一個(gè)layout相聯(lián)系;layout的任務(wù)是格式化用戶的logging request,appender的任務(wù)是把layout格式化好的輸出內(nèi)容送往指定的目的地。

PatternLayout

PatternLayoutLayout的一個(gè)子類(lèi),用來(lái)使用類(lèi)似C語(yǔ)言的printf函數(shù)中使用的格式控制字符串來(lái)控制日志的輸出格式。使用方法參考如下API

// Log4j APIs : class PatternLayout extends Layout
      
// 無(wú)參數(shù)構(gòu)造方法,使用DEFAULT_CONVERSION_PATTERN構(gòu)造一個(gè)PatternLayout 
// 注意:DEFAULT_CONVERSION_PATTERN為"%m%n",只打印消息信息 
public PatternLayout();
 
// 構(gòu)造方法,使用自定義的pattern構(gòu)造一個(gè)PatternLayout 
public PatternLayout(String pattern);
 
// 獲得和設(shè)置PatternLayout對(duì)象的日志pattern 
public String getConversionPattern();
public void setConversionPattern(String pattern);
          

patterns in PatternLayout

Fixme (heavyz)

To be added...

Configuration:配置

對(duì)log4j環(huán)境的配置就是對(duì)root logger的配置,包括把root logger設(shè)置為哪個(gè)級(jí)別(level);為它增加哪些appender,等等。這些可以通過(guò)設(shè)置系統(tǒng)屬性的方法來(lái)隱式地完成,也可以在程序里調(diào)用XXXConfigurator.configure()方法來(lái)顯式地完成。

默認(rèn)的log4j初始化過(guò)程

Logger類(lèi)的靜態(tài)初始化塊(static initialization block)中對(duì)log4j的環(huán)境做默認(rèn)的初始化。注意:如果程序員已經(jīng)通過(guò)設(shè)置系統(tǒng)屬性的方法來(lái)配置了log4j環(huán)境,則不需要再顯式地調(diào)用XXXConfigurator.configure()方法來(lái)配置log4j環(huán)境了。

Logger的靜態(tài)初始化塊在完成初始化過(guò)程時(shí)將檢查一系列log4j定義的系統(tǒng)屬性。它所做的事情如下:

  • 檢查系統(tǒng)屬性log4j.defaultInitOverride,如果該屬性被設(shè)置為false,則執(zhí)行初始化;否則(只要不是false,無(wú)論是什么值,甚至沒(méi)有值,都是否則),跳過(guò)初始化。
  • 把系統(tǒng)屬性log4j.configuration的值賦給變量resource。如果該系統(tǒng)變量沒(méi)有被定義,則把resource賦值為"log4j.properties"。注意:apachelog4j文檔中建議使用定義log4j.configuration系統(tǒng)屬性的方法來(lái)設(shè)置默認(rèn)的初始化文件是一個(gè)好方法。
  • 試圖把resource變量轉(zhuǎn)化成為一個(gè)URL對(duì)象url。如果一般的轉(zhuǎn)化方法行不通,就調(diào)用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法來(lái)完成轉(zhuǎn)化。
  • 如果url".xml"結(jié)尾,則調(diào)用方法DOMConfigurator.configure(url)來(lái)完成初始化;否則,則調(diào)用方法PropertyConfigurator.configure(url)來(lái)完成初始化。如果url指定的資源不能被獲得,則跳出初始化過(guò)程。

BasicConfigurator.configure()

BasicConfigurator.configure()方法使用最簡(jiǎn)的方法配置log4j環(huán)境。注:所謂配置log4j環(huán)境,就是指配置root logger,因?yàn)樗衅渌?/span>logger都是root logger的后代,所以它們(默認(rèn)情況下)都將繼承root logger的性質(zhì)。

BasicConfigurator.configure()完成的任務(wù)是:

  • 用默認(rèn)pattern創(chuàng)建PatternLayout對(duì)象p
    PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n");
  • p創(chuàng)建ConsoleAppender對(duì)象a,目標(biāo)是system.out,標(biāo)準(zhǔn)輸出設(shè)備:
    ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
  • root logger增加一個(gè)ConsoleAppender p
    rootLogger.addAppender(p);
  • root loggerlog level設(shè)置為DEBUG級(jí)別:
    rootLogger.setLevel(Level.DEBUG);

xml格式的log4j配置文件概述

xml格式的log4j配置文件需要使用org.apache.log4j.xml.DOMConfigurator.configure()方法來(lái)讀入。對(duì)xml文件的語(yǔ)法定義可以在log4j的發(fā)布包中找到:org/apache/log4j/xml/log4j.dtd。

log4jxml配置文件的樹(shù)狀結(jié)構(gòu)

log4jxml配置文件的樹(shù)狀結(jié)構(gòu)如下所示,注意下圖只顯示了常用的部分。

xml declaration and DTD
 |
log4j:configuration
 |
 +-- appender (name, class)
 |     |
 |     +-- param (name, value)
 |     +-- layout (class)
 |           |
 |           +-- param (name, value)
 +-- logger (name, additivity)
 |     |
 |     +-- level (class, value)
 |     |     |
 |     |     +-- param (name, value)
 |     +-- appender-ref (ref)
 +-- root
 |
 +-- param (name, class)
 +-- level
 |     |
 |     +-- param (name, value)
 +-- appender-ref (ref) 
          

xml declaration and DTD

xml配置文件的頭部包括兩個(gè)部分:xml聲明和DTD聲明。頭部的格式如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
          

log4j:configuration (root element)

  • xmlns:log4j [#FIXED attribute] : 定義log4j的名字空間,取定值"http://jakarta./log4j/"
  • appender [* child] : 一個(gè)appender子元素定義一個(gè)日志輸出目的地
  • logger [* child] : 一個(gè)logger子元素定義一個(gè)日志寫(xiě)出器
  • root [? child] : root子元素定義了root logger

appender

appender元素定義一個(gè)日志輸出目的地。

  • name [#REQUIRED attribute] : 定義appender的名字,以便被后文引用
  • class [#REQUIRED attribute] : 定義appender對(duì)象所屬的類(lèi)的全名
  • param [* child] : 創(chuàng)建appender對(duì)象時(shí)傳遞給類(lèi)構(gòu)造方法的參數(shù)
  • layout [? child] : appender使用的layout對(duì)象

layout

layout元素定義與某一個(gè)appender相聯(lián)系的日志格式化器。

  • class [#REQUIRED attribute] : 定義layout對(duì)象所屬的類(lèi)的全名
  • param [* child] : 創(chuàng)建layout對(duì)象時(shí)傳遞給類(lèi)構(gòu)造方法的參數(shù)

logger

logger元素定義一個(gè)日志輸出器。

  • name [#REQUIRED attribute] : 定義logger的名字,以便被后文引用
  • additivity [#ENUM attribute] : 取值為"true"(默認(rèn))或者"false",是否繼承父logger的屬性
  • level [? child] : 定義該logger的日志級(jí)別
  • appender-ref [* child] : 定義該logger的輸出目的地

root

root元素定義根日志輸出器root logger

  • param [* child] : 創(chuàng)建root logger對(duì)象時(shí)傳遞給類(lèi)構(gòu)造方法的參數(shù)
  • level [? child] : 定義root logger的日志級(jí)別
  • appender-ref [* child] : 定義root logger的輸出目的地

level

level元素定義logger對(duì)象的日志級(jí)別。

  • class [#IMPLIED attribute] : 定義level對(duì)象所屬的類(lèi),默認(rèn)情況下是"org.apache.log4j.Level類(lèi)
  • value [#REQUIRED attribute] : level對(duì)象賦值。可能的取值從小到大依次為"all"、"debug"、"info""warn"、"error"、"fatal""off"。當(dāng)值為"off"時(shí)表示沒(méi)有任何日志信息被輸出
  • param [* child] : 創(chuàng)建level對(duì)象時(shí)傳遞給類(lèi)構(gòu)造方法的參數(shù)

appender-ref

appender-ref元素引用一個(gè)appender元素的名字,為logger對(duì)象增加一個(gè)appender

  • ref [#REQUIRED attribute] : 一個(gè)appender元素的名字的引用
  • appender-ref元素沒(méi)有子元素

param

param元素在創(chuàng)建對(duì)象時(shí)為類(lèi)的構(gòu)造方法提供參數(shù)。它可以成為appender、layoutfilter、errorHandlerlevel、categoryFactoryroot等元素的子元素。

  • name and value [#REQUIRED attributes] : 提供參數(shù)的一組名值對(duì)
  • param元素沒(méi)有子元素

xml文件中配置appenderlayout

創(chuàng)建不同的Appender對(duì)象或者不同的Layout對(duì)象要調(diào)用不同的構(gòu)造方法??梢允褂?/span>param子元素來(lái)設(shè)定不同的參數(shù)值。

創(chuàng)建ConsoleAppender對(duì)象

ConsoleAppender的構(gòu)造方法不接受其它的參數(shù)。

... ... ... ...
<appender name="console.log" class="org.apache.log4j.ConsoleAppender">
 <layout ... >
    ... ...
 </layout>
</appender>
... ... ... ...
          

創(chuàng)建FileAppender對(duì)象

可以為FileAppender類(lèi)的構(gòu)造方法傳遞兩個(gè)參數(shù):File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值為"true""false"(默認(rèn))。

... ... ... ...
<appender name="file.log" class="org.apache.log4j.FileAppender">
 <param name="File" value="/tmp/log.txt" />
 <param name="Append" value="false" />
 <layout ... >
    ... ...
 </layout>
</appender>
... ... ... ...
          

創(chuàng)建RollingFileAppender對(duì)象

除了FileAppend以外,還可以為RollingFileAppender類(lèi)的構(gòu)造方法傳遞兩個(gè)參數(shù):MaxBackupIndex備份日志文件的個(gè)數(shù)(默認(rèn)是1個(gè));MaxFileSize表示日志文件允許的最大字節(jié)數(shù)(默認(rèn)是10M)。

... ... ... ...
<appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="/tmp/rollingLog.txt" />
 <param name="Append" value="false" />
 <param name="MaxBackupIndex" value="2" />
 <param name="MaxFileSize" value="1024" />
 <layout ... >
    ... ...
 </layout>
</appender>
... ... ... ...
          

創(chuàng)建PatternLayout對(duì)象

可以為PatternLayout類(lèi)的構(gòu)造方法傳遞參數(shù)ConversionPattern。

... ... ... ...
<layout class="org.apache.log4j.PatternLayout>
 <param name="Conversion" value="%d [%t] %p - %m%n" />
</layout>
... ... ... ...
          

我自己的一個(gè)使用xml文件配置log4j環(huán)境的很簡(jiǎn)單的例子

WSOTAWeb Services Over The Air)項(xiàng)目開(kāi)發(fā)java web start的胖客戶端時(shí),使用了如下的xml文件配置log4j環(huán)境(文件名為wsota-rc.log4j.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta./log4j/">
 
 <!-- ================================================================= -->
 <!--                     a rolling file appender                       -->
 <!-- ================================================================= -->
 <appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="/tmp/wsota-rc.log" />
    <param name="Append" value="false" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n" />
    </layout>
 </appender>
 
 <!-- ================================================================= -->
 <!--                       a console appender                          -->
 <!--     debug can be turned off by setting level of root to "off"     -->
 <!-- ================================================================= -->
 <appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n" />
    </layout>
 </appender>
 
 <!-- use this to turn on debug to a rolling file. -->
 <root>
    <level value="debug" />
    <appender-ref ref="wsota-rc.file.log" />
 </root>
 
 <!-- use this to turn on debug to console. -->
 <!--
 <root>
    <level value="off" />
    <appender-ref ref="wsota-rc.console.log" />
 </root>
 -->
 
 <!-- use this to turn off debug. -->
 <!--
 <root>
    <level value="off" />
    <appender-ref ref="wsota-rc.console.log" />
 </root>
 -->
 
</log4j:configuration>
        

在胖客戶程序中使用了如下代碼來(lái)使用外部xml文件配置log4j環(huán)境,注意該代碼段位于程序的main class的靜態(tài)初始化塊中,含有以下代碼的類(lèi)和xml配置文件在同一個(gè)目錄下:

import org.apache.log4j.xml.DOMConfigurator;
 
public class SapFrame extends JFrame {
    static {
        DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.xml"));
    }
    ... ... ... ...
}
        

Log4j的編碼習(xí)慣

  • 讓每個(gè)類(lèi)都擁有一個(gè)private staticLogger對(duì)象,用來(lái)輸出該類(lèi)中的全部日志信息
  • 使用xml文件來(lái)完成對(duì)log4j環(huán)境的配置。在項(xiàng)目的main class中的靜態(tài)初始化塊里放log4j環(huán)境的配置代碼。注意:在一個(gè)項(xiàng)目中,log4j環(huán)境只需要被配置一次,而不是在每個(gè)使用了logger的類(lèi)里都需要調(diào)用一次
  • MyClass.class作為參數(shù)創(chuàng)建該類(lèi)的靜態(tài)Logger對(duì)象

Fixme (heavyz)

To add more...

參考資料

 

最近在搞一個(gè)項(xiàng)目架設(shè),希望從構(gòu)建一個(gè)項(xiàng)目方方面面都徹底研究透,增長(zhǎng)實(shí)戰(zhàn)經(jīng)驗(yàn)。
今天先研究一下日志的構(gòu)建,這里選擇了log4j--java方面比較流行的log框架,功能
很強(qiáng)大,使用起來(lái)也很方便了

      廢話少說(shuō),先看看一個(gè)史上最簡(jiǎn)單的log例子,看看我是如何用最簡(jiǎn)潔的設(shè)計(jì)實(shí)現(xiàn)將異常
等信息寫(xiě)入日志文件的。

項(xiàng)目文件結(jié)構(gòu)
--------TestLog
           |----src
           |     |-com/janeky/log/Log.java
           |     |-log4j.properties
           |----bin
           |     |-com/janeky/log/Log
           |----lib
           |     |-log4j-1.2.11.jar


Eclipse新建一個(gè)java project TestLog
新建一個(gè)com.janeky.log包
導(dǎo)入log4j的jar包
包里新建一個(gè)Log.java

 view plaincopy to clipboardprint?
package com.janeky.log;  
import org.apache.log4j.Logger;  
import org.apache.log4j.PropertyConfigurator;  
 
/** 
 * @author janeky 
 * Log演示程序 
 */ 
public class Log {  
    //Logger實(shí)例  
    private Logger loger;  
    //將Log類(lèi)封裝成單實(shí)例的模式,獨(dú)立于其他類(lèi)。以后要用到日志的地方只要獲得Log的實(shí)例就可以方便使用  
    private static Log log;  
    //構(gòu)造函數(shù),用于初始化Logger配置需要的屬性  
    private Log()  
    {  
        //獲得當(dāng)前目錄路徑  
        String filePath=this.getClass().getResource("/").getPath();  
        //找到log4j.properties配置文件所在的目錄(已經(jīng)創(chuàng)建好)  
        filePath=filePath.substring(1).replace("bin", "src");  
        //獲得日志類(lèi)loger的實(shí)例  
        loger=Logger.getLogger(this.getClass());  
        //loger所需的配置文件路徑  
        PropertyConfigurator.configure(filePath+"log4j.properties");  
    }  
      
    static Log getLoger()  
    {  
        if(log!=null)  
            return log;  
        else 
            return new Log();  
    }  
      
    //測(cè)試函數(shù)  
    public static void main(String args[])  
    {  
        Log log=Log.getLoger();  
        try 
        {  
            //引發(fā)異常  
            int a=2/0;  
        }catch(Exception e)  
        {  
            //控制臺(tái)打印異常信息  
            e.printStackTrace();  
            //寫(xiě)入到日子文件  
            log.loger.error("error", e);  
              
        }  
    }  
 

package com.janeky.log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * @author janeky
 * Log演示程序
 */
public class Log {
 //Logger實(shí)例
 private Logger loger;
 //將Log類(lèi)封裝成單實(shí)例的模式,獨(dú)立于其他類(lèi)。以后要用到日志的地方只要獲得Log的實(shí)例就可以方便使用
 private static Log log;
 //構(gòu)造函數(shù),用于初始化Logger配置需要的屬性
 private Log()
 {
  //獲得當(dāng)前目錄路徑
  String filePath=this.getClass().getResource("/").getPath();
  //找到log4j.properties配置文件所在的目錄(已經(jīng)創(chuàng)建好)
  filePath=filePath.substring(1).replace("bin", "src");
  //獲得日志類(lèi)loger的實(shí)例
  loger=Logger.getLogger(this.getClass());
  //loger所需的配置文件路徑
  PropertyConfigurator.configure(filePath+"log4j.properties");
 }
 
 static Log getLoger()
 {
  if(log!=null)
   return log;
  else
   return new Log();
 }
 
 //測(cè)試函數(shù)
 public static void main(String args[])
 {
  Log log=Log.getLoger();
  try
  {
   //引發(fā)異常
   int a=2/0;
  }catch(Exception e)
  {
   //控制臺(tái)打印異常信息
   e.printStackTrace();
   //寫(xiě)入到日子文件
   log.loger.error("error", e);
  
  }
 }

}


在src文件夾中新建一個(gè)文本文檔 log4j.properties

view plaincopy to clipboardprint?
#定義DEBUG優(yōu)先級(jí),R為日志輸出目的的  
log4j.rootLogger=DEBUG, R  
#設(shè)置日志輸出類(lèi)型,為文件類(lèi)型  
log4j.appender.R=org.apache.log4j.FileAppender  
#設(shè)置日志文件名my.log  
log4j.appender.R.file=my.log  
#每次在文件尾寫(xiě)入新的日志信息  
log4j.appender.R.Append=true 
#日志輸出信息格式類(lèi)型  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
#日志輸出信息格式為 換行、換行、日期、優(yōu)先級(jí)、[類(lèi)名]、日志信息、換行  
log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n 
#定義DEBUG優(yōu)先級(jí),R為日志輸出目的的
log4j.rootLogger=DEBUG, R
#設(shè)置日志輸出類(lèi)型,為文件類(lèi)型
log4j.appender.R=org.apache.log4j.FileAppender
#設(shè)置日志文件名my.log
log4j.appender.R.file=my.log
#每次在文件尾寫(xiě)入新的日志信息
log4j.appender.R.Append=true
#日志輸出信息格式類(lèi)型
log4j.appender.R.layout=org.apache.log4j.PatternLayout
#日志輸出信息格式為 換行、換行、日期、優(yōu)先級(jí)、[類(lèi)名]、日志信息、換行
log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n

運(yùn)行吧,出錯(cuò)了,恭喜你成功了,去TestLog目錄下尋找my.log日志信息吧


以后再任何需要記錄日志的地方只要使用下面語(yǔ)句就行了
Log log= Log.getLogger();
log.logger.error("something u like to record");

記錄日志就是這么簡(jiǎn)單,不過(guò)你可以有其他的需要:

我要將日志發(fā)到郵箱
我要將日志寫(xiě)到數(shù)據(jù)庫(kù)
我要每天的日志自動(dòng)歸檔
……

這些都可以通過(guò)修改配置log4j.properties配置文件來(lái)實(shí)現(xiàn)
以下是配置文件的語(yǔ)法


1. log4j.rootLogger = [level],appenderName,appenderName...
其中,level是日志記錄的優(yōu)先級(jí),從高到低分別為FATAL ERROR WARN INFO DEBUG 。當(dāng)
你定義一個(gè)級(jí)別,只有等于或者高于這個(gè)基本的才進(jìn)行處理。 可選的All打印所有日志,OFF
關(guān)閉所有日志輸出。
appenderName用于指定日志信息輸出目的地,可以指定多個(gè)

2.配置appender

類(lèi)型有以下幾種
org.apache.log4j.jdbc.JDBCAppender 存入數(shù)據(jù)庫(kù)
org.apache.log4j.net.SMTPAppender  發(fā)送到指定郵箱
net.cybercorlin.util.logger.appender.IMAppender 自定義類(lèi)型
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)生一個(gè)新的文件
org.apache.log4j.WriterAppender 將日志信息以流格式發(fā)送到任意指定的地方
*************可以參照文章后面從網(wǎng)上摘抄的例子************

3.配置日志信息格式Layout
有以下幾種
org.apache.log4j.HTMLLayout HTML表格形式
org.apache.log4j.PatternLayout 自定義的布局(下面將見(jiàn)到這么自定義配置)
org.apache.log4j.SimpleLayout 只包含日志信息基本和信息的字符信息
org.apache.log4j.TTCCLayout   包括日志產(chǎn)生時(shí)間、線程、類(lèi)別等信息

4.自定義的布局中用到的格式化日志信息
采用跟C語(yǔ)言中printf的方式,參數(shù)有
%m 輸出代碼中指定的信息 如 log.error("error")
%p 輸出優(yōu)先級(jí) 就是上面提到的DEBUG,INFO等
%c 輸出所在類(lèi)的全名
%r 輸出自應(yīng)用啟用到輸出該log信息耗費(fèi)的時(shí)間(毫秒)
%t 輸出產(chǎn)生該日子事件的線程名
%n 輸出換行符號(hào) Windows平臺(tái)為 "rn",unix平臺(tái)“n"
%d 輸出日志時(shí)間點(diǎn) 默認(rèn)格式是ISO8601 可以自定義格式,比如%d{yyy MM dd hh:mm:ss,sss}


與 Javalog4j有關(guān)的信息
一個(gè)不太讓人討厭的自動(dòng)彈出窗口
已有 0 位網(wǎng)友發(fā)表了看法發(fā)表評(píng)論
 
我也來(lái)說(shuō)兩句!
  請(qǐng)自覺(jué)遵守相關(guān)政策法規(guī),嚴(yán)禁發(fā)布色情/暴力/反動(dòng)言論。
訪問(wèn)本頁(yè)的讀者也讀過(guò)
 增加Apache最大連接數(shù)的方法詳細(xì)介紹
 Nginx 0.6.31 + PHP 5.2.6(FastCGI)搭建勝過(guò)Web服務(wù)器(一)
 Sql數(shù)據(jù)庫(kù)MDF數(shù)據(jù)文件數(shù)據(jù)庫(kù)恢復(fù)
 SSMS中使用自動(dòng)換行功能 簡(jiǎn)單讀取T-SQL代碼
浮點(diǎn)運(yùn)算指令集
通過(guò)定制編程來(lái)最大化Java程序性能
守護(hù)線程(Deamon)
也談WEB打印(四):并根據(jù)內(nèi)容動(dòng)態(tài)的生成頁(yè)面(續(xù))
Oracle數(shù)據(jù)庫(kù)維護(hù)常用SQL語(yǔ)句集合(2)
PHP讀取XML 值 - PHP讀取XML 內(nèi)容 (三)
Delphi中預(yù)編譯指令如何使用
關(guān)于scanf的返回值
利用XML技術(shù)獲取域名的世界排名數(shù)字
Mysql字段長(zhǎng)度

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    熟女乱一区二区三区四区| 色综合视频一区二区观看| 国产精品一区二区三区激情| 91一区国产中文字幕| 91精品蜜臀一区二区三区| 精品一区二区三区不卡少妇av| 日韩在线中文字幕不卡| 丁香六月啪啪激情综合区| 日本不卡在线视频你懂的| 久久少妇诱惑免费视频| 91国内视频一区二区三区| 亚洲日本久久国产精品久久| 精品国产丝袜一区二区| 精品伊人久久大香线蕉综合| 亚洲熟妇熟女久久精品| 日韩在线精品视频观看| 欧美黑人暴力猛交精品| 中文字幕免费观看亚洲视频| 特黄大片性高水多欧美一级| 中文字幕乱码免费人妻av| 日本三区不卡高清更新二区| 少妇人妻一级片一区二区三区| 激情爱爱一区二区三区| 亚洲做性视频在线播放| 国产午夜精品在线免费看| 国产一区在线免费国产一区| 欧美偷拍一区二区三区四区| 日本一级特黄大片国产| 大香蕉网国产在线观看av| 日韩精品视频高清在线观看| 中文字幕乱码亚洲三区| 一区二区福利在线视频| 激情五月综五月综合网| 欧美日韩精品人妻二区三区| 国产成人人人97超碰熟女| 日韩一区欧美二区国产| 丰满人妻熟妇乱又伦精另类视频 | 欧美日韩一级黄片免费观看| 国产一区一一一区麻豆| 亚洲精品深夜福利视频| 亚洲最新中文字幕在线视频|