[原創]java中的日誌操作方法—Log4J

來源:互聯網
上載者:User

  在應用程式中輸出日誌有有三個目的:

(1)監視代碼中變數的變化情況,把資料周期性地記錄到檔案中供其他應用進行統計分析工作。

(2)跟蹤代碼運行進軌跡,作為日後審計的依據。

(3)擔當整合式開發環境中的調試器,向檔案或控制台列印代碼的調試資訊。

  Apache能用日誌包(Commons Logging Package)是Apache的一個開放原始碼項目,它提供了一組通用的日誌介面,使用者可以自由地選擇實現日誌介面的第三方軟體。通用日誌包目前支援以下日誌實現:

  • Log4J日誌器(http://jakarta.apache.org/log4j)
  • JDK1.4 Logging日誌器(JDK1.4內建)
  • SimpleLog日誌器(把日誌訊息輸出到標準系統錯誤流System.err)
  • NoOpLog(不輸出任何日誌資訊)

通用日誌包中的兩個常用介面:LogFactory和Log,分別介紹如下:

  • Log介面

通用日誌包把訊息分為6個層級:FATAL、ERROR、WARN、INFO、DEBUG和TRACE。其中FATAL層級最高,TRACE層級最低。Log介面提供輸出不同層級訊息的方法:

fatal(Object message)-------輸出FATAL層級的訊息。

error(Object message)-------輸出ERROR層級的訊息。

warn(Object message)-------輸出WARN層級的訊息。

info(Object message)-------輸出INFO層級的訊息。

debug(Object message)-------輸出DEBUG層級的訊息。

trace(Object message)-------輸出TRACE層級的訊息。

註:只有當輸出日誌的層級大於或等於為日誌配置器配置的記錄層級時,這個方法才會執行。

  如何指定日誌器的記錄層級,不同的日誌器實現會有不同的實現方案。

  • LogFactory介面

LogFactory介面提供了獲得日誌器執行個體的兩個靜態方法:

public static Log getLog(String name) throws LogConfigurationException;

public static Log getLog(Class class) throws LogConfigurationException;

註:name參數作為日誌器的名字;class參數指定類名作為日誌器名字。

以下介紹最常用的一個日誌實現--------Log4J

  Log4j是Apache的一個開放原始碼項目,它是一個日誌操作包。通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制台、檔案、GUI組件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的層級,我們能夠更加細緻地控制日誌的產生過程。最令人感興趣的就是,這些可以通過一個設定檔來靈活地進行配置,而不需要修改應用的代碼。
此外,通過Log4j其他語言介面,您可以在C、C++、.Net、PL/SQL程式中使用Log4j,其文法和用法與在Java程式中一樣,使得多語言分布式系統得到一個統一一致的日誌組件模組。而且,通過使用各種第三方擴充,您可以很方便地將Log4j整合到J2EE、JINI甚至是SNMP應用中。

  Log4J主要由三大組件構成:

  • Logger:負責組建記錄檔,並能根據配置的記錄層級來決定什麼日誌訊息應該被輸出,什麼日誌訊息應該被忽略。
  • Appender:定義日誌訊息輸出的目的地,指定日誌訊息應該被輸出到什麼地方,這些地方可以是控制台、檔案和網路裝置等。
  • Layout:指定日誌訊息的輸出格式。

  這三個組件協同工作,使得開發人員能夠依據日誌訊息類別來輸出日誌,並能夠在程式運行期間,控制日誌訊息的輸出格式以及日誌存放地點。

  Log4J的配置

  配置Log4J,需要分別配置它的Logger、Appender和Layout屬性。設定檔一般為log4j.properties。當然也可以以XML檔案來配置,這裡介紹以屬性檔案配置。

  • 配置Logger組件

Logger組件支援繼承關係,所有的Logger組件都直接或間接繼承rootLogger。配置rootLogger的文法為:

  log4j.rootLogger=[priority],appenderName,appenderName,......

priority是如前所述的記錄層級;

appenderName指定Appender組件,使用者可以同時指定多個Appender組件,以與逗號分隔。

  • 配置Appender組件

配置日誌訊息輸出目的地Appender,文法為:

  log4j.appender.appenderName=<appender的完整類名>

  log4j.appender.appenderName.option1=value1

  log4j.appender.appenderName.option2=value2

  ...

Log4J共有以下幾種Appender:

  org.apache.log4j.ConsoleAppender(控制台)

  org.apache.log4j.FileAppender(檔案)

  org.apache.log4j.DailyRollingFileAppender(每天產生一個記錄檔)

  org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)

  org.apache.log4j.WriterAppender(將日誌訊息以流格式發送到任意指定的地方)

  • 配置Layout組件

文法:

   log4j.appender.appenderName.layout=<layout的完整類名>

   log4j.appender.appenderName.layout.option1=value1

   log4j.appender.appenderName.layout.option2=value2

   ...

Log4J提供以下幾種Layout:

  org.apache.log4j.HTMLLayout(以HTML表格形式布局)

  org.apache.log4j.PatternLayout(可以靈活地指定配置模式)

  org.apache.log4j.SimpleLayout(包含日誌訊息的層級和資訊字串)

  org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程和類別等資訊)

通過設定PatternLayout的ConversionPattern屬性來指定輸出格式

ConversionPattern的格式如下表所示:

 

格式名      含義
%c       輸出日誌資訊所屬的類的全名
%d      輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:

                            %d{yyy-MM-dd HH:mm:ss },輸出類似:2002-10-18- 22:10:28
%f       輸出日誌資訊所屬的類的類名
%l       輸出日誌事件的發生位置,即輸出日誌資訊的語句處於它所在的類的第幾行
%m        輸出代碼中指定的資訊,如log(message)中的message
%n      輸出一個斷行符號分行符號,Windows平台為“/r/n”,Unix平台為“/n”
%p      輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推
%r      輸出自應用啟動到輸出該日誌資訊所耗費的毫秒數
%t      輸出產生該日誌事件的線程名


樣本:log4j.appender.file.layout=org.apache.log4j.PatternLayout

   log4j.appender.file.layout.ConversionPattern=%t %p- %m%n

Log4J對應用效能的影響

  如果在程式運行中輸出大量日誌,顯然會對應用的效能造成一定的影響。Log4J對效能的影響取決於以下因素:

  • 日誌輸出目的地:輸出到控制台的速度和輸出到檔案系統的速度是不一樣的。
  • 日誌輸出格式:格式簡單,速度也更快。
  • 記錄層級:記錄層級設定的越低,輸出的日誌內容越多,對效能的影響也越大。

Log4J的簡單使用

簡單介紹log4j一般的使用步驟,分以下五步。  
(前提下載apache的log4j.jar包)
1、建一個log4j.properties的設定檔,放到有main的入口類的相同路徑下。
  #錯誤的層級,存放器分別控制台與檔案
  log4j.rootLogger =debug,A,R
  #A可隨便寫,輸出控制台,自己指定布格式
  log4j.appender.A = org.apache.log4j.ConsoleAppender
  log4j.appender.A.layout = org.apache.log4j.PatternLayout
  log4j.appender.A.layout.ConversionPattern = [%t] %-5p %c %x - %m%n
 
  #R可隨便寫,輸出在檔案,檔案位置/立即重新整理/最大改寸/備份個數/布局格式
  log4j.appender.R=org.apache.log4j.RollingFileAppender
  log4j.appender.R.File=d:/logger.log
  log4j.appender.R.ImmediateFlush=true
  log4j.appender.R.MaxFileSize=100KB
  log4j.appender.R.MaxBackupIndex=1
  log4j.appender.R.layout=org.apache.log4j.PatternLayout
  log4j.appender.R.layout.ConversionPattern=%d{ABSOLUTE} [%t] %-5p %-30c{3} %x - %m %n

  2、在入口類的靜態區初始化log4j
static {
PropertyConfigurator.configure(
YesFTPClientFrame.class.getResource("log4j.properties"));
}

  3、在每一個需要log的地方都初始化一個私人靜態變數
private static Logger logger = Logger.getLogger(xx.class);

  4、使用log4j提供的方法
logger.info(”hello”);

  5、用log4j輸出異常的堆棧資訊
logger.error("oops, got an exception: ", e);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.