茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1669343 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
F09_569.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼] log4j 的說明及實作

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼] log4j 的說明及實作
[Java] log4j 的說明及實作
From: Polin Wei

簡介 Introduction
  Log4j 是一套開放源碼的工具,方便編程人員在程式中加入 log 機制,並輸出到各種目標上。Log4j 能夠透過外部的設定檔(properites 或 XML)進行設定。Log4j 能夠將 log message 寫到 console, 檔案,串流,TCP 協定的伺服器, Unix Syslog daemon 等。詳細的說明可以參考官方網 log4j

組成 Log4j 的三大元件(Loggers, Appenders and Layouts) :
  Logger - 由編程人員在程式中使用,進行 logging 的元件
  Appender - 負責將 log message 輸出到各種裝置上
  Layout - 決定 log message 的格式

Loggers:
  Logger 可以被指派等級。能夠指派給 Logger 的等級有 : DEBUG, INFO, WARN, ERROR, FATAL 5 種,定義在 org.apache.log4j.Level 類別中。這 5 種等級的高低順序為 FATAL > ERROR > WARN > DEBUG > INFO 。
  Logger 的等級決定它產生 log message 的數量 : Logger 只寫"出高於或等於本身等級"的 log message。例如某個 Logger 的等級被設定為 WARN,那麼它只會寫出等級為 WARN, ERROR, FATAL 的 log message,對於 DEBUG, INFO 的 log message 則不予理會。
  若是 Logger 的等級未被設定,則會自動使用 parent(上一層) 的等級。如果程式中所有的 Logger 都未設定等級,則由 root logger 決定。
  Logger 之間以名稱區分,所以在程式中任何地方,呼叫 Logger.getLogger(),並傳入同一個 Logger 名稱,則會得到同一個 Logger 的 reference。
  Logger 之間以名稱區分出階層。即使父階層在程式中出現的時機比子階層晚,例如 "com.foo" logger 比 "com.foo.bar" 被取得的時間來得晚,"com.foo" 仍然是 "com.foo.bar" 的父階層(會影響到子階層 logger 未被定義的屬性, log 等級, appender, layout )。

Appenders:
  透過 Appender, Logger 能夠將 log message 輸出到指定的裝置上。一個 Logger 能夠擁有多個 Appender,所以 Logger 能夠同時將 log message 輸出到多個個裝置上。
  Appender 的設定亦會反映在 Logger 的階層中。當 Logger 輸出一筆 log message 時,父階層的 Appender 和自己的 Appender(如果有的話)都會記錄到這筆 log message;
  例如 "com.foo" Logger 有一個 Appender 將 log message 輸出到 console,而 "com.foo.bar" 有一個 Appender 將 log message 輸出到檔案;當 "com.foo.bar" Logger 輸出一筆 log message 時, console 和檔案都會出現這筆 log message。
  而最簡單的例子,就是當 root logger 擁有一個輸出到 console 的 Appender 時,則程式中所有的 logger 所產生的 log message 都會輸出到 console。唯一個例外的情況,就是當某個 logger 將自己的 additivity 屬性設為 false(Logger.setAdditivity(false)),則此 logger 與隸屬於它的子 logger 都不會將 log message 寫到 console。

Layouts:
  可以透過 Layout 的配置,自由改變 Logger 寫出 log message 的格式。例如,為 Logger 加入一個 conversion pattern 為 "%r [%t] %-5p %c - %m%n" 的 PatternLayout,則輸出的 log message 就可能會像下列這樣:
176 [main] INFO org.foo.Bar - Located nearest gas station.

PatternLayout 的 格式字元列表如下:
# %c 輸出日誌訊息所屬的類別的全名
# %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
# %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
# %m 輸出訊息,如log(message)中的message。
# %n 輸出一個列尾符號。
# %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %t 輸出產生該日誌事件的線程名。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %f 輸出日誌訊息所屬的類別的類別名。

Layout 亦會反映在 Logger 的階層上。

實作:
1. 修改 log4j.xml 檔
  在JBOSS(version:4.0.3SP1) 上的 log4j.xml 實作,可以分兩個層次來看:

一是修改 Server 端的 log4j.xml ,檔案在:$JBOSS_HOME/server/default/conf/log4j.xml
一是修改每個Prjoject中的 $Java Resource/src 程式原始檔目錄下的 log4j.xml

這兩個檔案內容大致相同,差異只在 Project 端的 logger 參數在 Server 端要改成 category
Server 端的 log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<!-- ============================================================ -->
<!--  Log4j Configuration -->
<!-- ============================================================ -->

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

   <!-- ======================== -->
   <!-- Preserve messages in a local file -->
   <!-- ======================== -->

   <!-- A time/date based rolling appender 定義 log message 輸出FILE檔案 -->
   <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
      <param name="Append" value="false"/>

      <!-- Rollover at midnight each day -->
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>

      <!-- 定義 log message 的格式 -->
      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n -->
         <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>

      </layout>
   </appender>


   <!-- ===================================================== -->
   <!-- Append messages to the console 定義 log message 輸出 Console -->
   <!-- ===================================================== -->

   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="Target" value="System.out"/>
      <param name="Threshold" value="INFO"/>

      <!-- 定義 log message 的格式 -->
      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n -->
         <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
      </layout>
   </appender>


   <!-- ========================================= -->
   <!-- Limit categories 對 class: com.demos 作偵錯觀察 -->
   <!-- ========================================= -->
   <category name="com.demos">
      <priority value="DEBUG"/>
   </category>

   <!-- ============================ -->
   <!-- Setup the Root category 設定 log 要在那裡產生 -->
   <!-- ============================ -->

   <root>
      <appender-ref ref="CONSOLE"/>
      <appender-ref ref="FILE"/>
   </root>

</log4j:configuration>

Project 端的 log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

   <!-- ===================================================== -->
   <!-- Append messages to the console 定義 log message 輸出至 Console 及 log 內容格式 -->
   <!-- ===================================================== -->
    <appender name="default" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%C-%M]%n%m%n%n" />
        </layout>
    </appender>

    <!-- 設定要偵錯的 calss: com.demos 及 log 要輸出到那一個裝置-->
    <logger name="com.demos">
        <level value="debug" />
        <appender-ref ref="default" />
    </logger>

</log4j:configuration>

2. 在 java 程式 com.demos.LookupFormF.java 中放入偵錯點
package com.demos;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.log4j.Logger;

public class LookupFormF extends ActionForm{

    static Logger loger = Logger.getLogger(LookupFormF.class.getName());
    private String symbol = null;

    public String getSymbol() {
        return (symbol);
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
        loger.debug(symbol);
    }
}

3. 成果如下
16:54:23,733 INFO  [STDOUT] [DEBUG] 24 十月 04:54:23.733 下午 http-0.0.0.0-8043-
1 [com.demos.LookupFormF-setSymbol]
polinwei


原文出處:我與小崴崴的工作日記: [Java] log4j 的說明及實作
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼] Log4J
[JAVA] Log4J

資料來源:http://jameslin1203memo.blogspot.com/2006_03_01_jameslin1203memo_archive.html#114256516645009463

這篇筆記是參考 Log4j 官方網站的文件,以及網路上所找到的文章所寫成的。

簡介 :
Log4j 是一套開放源碼的工具,方便編程人員在程式中加入 log 機制,並輸出到各種目標上。Log4j 能夠透過外部的設定檔(properites 或 XML)進行設定。Log4j 能夠將 log message 寫到 console, 檔案,串流,TCP 協定的伺服器, Unix Syslog daemon 等。Log4j 具有 5 種 log 層級(DEBUG, INFO, WARN, ERROR, FATAL),可用於不同的系統狀態下所產生的訊息。

組成 Log4j 的三大元件 :
Logger - 由編程人員在程式中使用,進行 logging 的元件
Appender - 負責將 log message 輸出到各種裝置上
Layout - 決定 log message 的格式

Log4j 的階層架構 :
一個程式中可以擁有多個 Logger,這些 Logger之間以名稱區分,並以此區分出階層。例如有一個 Logger 的名稱為 "com.foo",那麼另一個名為 "com.foo.bar" 的 Logger 就隸屬於 "com.foo" logger,如果 "com.foo.bar" 未定義自己的 log 等級,則以 "com.foo" 的 log 等級為預設值。
階層的最高為 root logger。Root logger 一定在存,不具有名稱屬性,可以隨時在程式中以 Logger.getRootLogger() 取得,其它 logger 則以 Logger.getLogger(String loggerName) 取得。

Logger :
Logger 可以被指派等級。能夠指派給 Logger 的等級有 : DEBUG, INFO, WARN, ERROR, FATAL 5 種,定義在 org.apache.log4j.Level 類別中。這 5 種等級的高低順序為 FATAL > ERROR > WARN > INFO > DEBUG。
Logger 的等級決定它產生 log message 的數量 : Logger 只寫"出高於或等於本身等級"的 log message。例如某個 Logger 的等級被設定為 WARN,那麼它只會寫出等級為 WARN, ERROR, FATAL 的 log message,對於 DEBUG, INFO 的 log message 則不予理會。
若是 Logger 的等級未被設定,則會自動使用 parent(上一層) 的等級。如果程式中所有的 Logger 都未設定等級,則由 root logger 決定。
Logger 之間以名稱區分,所以在程式中任何地方,呼叫 Logger.getLogger(),並傳入同一個 Logger 名稱,則會得到同一個 Logger 的 reference。
Logger 之間以名稱區分出階層。即使父階層在程式中出現的時機比子階層晚,例如 "com.foo" logger 比 "com.foo.bar" 被取得的時間來得晚,"com.foo" 仍然是 "com.foo.bar" 的父階層(會影響到子階層 logger 未被定義的屬性, log 等級, appender, layout )。

Appender:
透過 Appender, Logger 能夠將 log message 輸出到指定的裝置上。一個 Logger 能夠擁有多個 Appender,所以 Logger 能夠同時將 log message 輸出到多個個裝置上。
Appender 的設定亦會反映在 Logger 的階層中。當 Logger 輸出一筆 log message 時,父階層的 Appender 和自己的 Appender(如果有的話)都會記錄到這筆 log message;例如 "com.foo" Logger 有一個 Appender 將 log message 輸出到 console,而 "com.foo.bar" 有一個 Appender 將 log message 輸出到 檔案;當 "com.foo.bar" Logger 輸出一筆 log message 時, console 和檔案都會出現這筆 log message。而最簡單的例子,就是當 root logger 擁有一個輸出到 console 的 Appender 時,則程式中所有的 logger 所產生的 log message 都會輸出到 console。唯一個例外的情況,就是當某個 logger 將自己的 additivity 屬性設為 false(Logger.setAdditivity(false)),則此 logger 與隸屬於它的子 logger 都不會將 log message 寫到 console。

Layout:
編程人員透過 Layout 的配置,能夠自由改變 Logger 寫出 log message 的格式。例如,為 Logger 加入一個 conversion pattern 為 "%r [%t] %-5p %c - %m%n" 的 PatternLayout,則輸出的 log message 就可能會像下列這樣:
176 [main] INFO  org.foo.Bar - Located nearest gas station.

PatternLayout 的 格式字元列表如下:
    %c 輸出日誌訊息所屬的類別的全名
    %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
    %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
    %m 輸出代碼中指定的訊息,如log(message)中的message。
    %n 輸出一個列尾符號。
    %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。-5p 代表將此字串填滿至 5 個字元,以空白補不足處。
    %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
    %t 輸出產生該日誌事件的線程名。
    %f 輸出日誌訊息所屬的類別的類別名。

Layout 亦會反映在 Logger 的階層上。

設定 :
設定 Log4j 有 2 種方式 : 以 Java 程式碼配置組態,或是以外部設定檔進行設定。無論以哪種方式進行,不外下列幾個主要的步驟:

定義 Root Logger 的等級 - 此設定會成為 logger 的預設等級
定義 Root Logger 的 Appender - 如果有定義 Root Logger,則 Root Logger 的 Appender 一定要指定
定義 Root Logger Appender 的 Layout - 定義 Layout 的類別後,可以選擇是否要定義該 Layout 的 conversion pattern
定義個別的 Logger,其它步驟同 Root Logger

最簡單的使用方式 - 使用 BasicConfigurator 進行設定, Root Logger 將會被設定為 DEBUG 等級,並且將 log message 以 "%r [%t] %p %c %x - %m%n" 的格式輸出到 console :
package yc.usingLog4j;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

public class UsingLog4j {
     private static Logger logger = Logger.getLogger(UsingLog4j.class);

     public static void main(String[] args) {
     BasicConfigurator.configure();

     logger.info("This is an info message.");
     logger.debug("This is a debug message.");
 }
}

將 Log4j 的設定提到外部檔案(*.properties),讓程式較具有彈性。以下是一個設定檔的範例 :
#定義 Root Logger 的等級為 INFO,且為其指定一個 appender 名為 rootAppender.
log4j.rootLogger=info, rootAppender

#指定 rootAppender 的類型.
log4j.appender.rootAppender=org.apache.log4j.ConsoleAppender

#指定 rootAppender 的 Layout.
log4j.appender.rootAppender.layout=org.apache.log4j.PatternLayout

#指定 rootAppender Layout 的輸出格式.
log4j.appender.rootAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

#設定特定名稱的 Logger.
log4j.logger.yc.usingLog4j.UsingLog4jA=INFO, log4jaAppender
log4j.appender.log4jaAppender=org.apache.log4j.RollingFileAppender
log4j.appender.log4jaAppender.File=d:/tmp/usinglog4j.log
log4j.appender.log4jaAppender.MaxFileSize=100KB
log4j.appender.log4jaAppender.MaxBackupIndex=10
log4j.appender.log4jaAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.log4jaAppender.layout.ConversionPattern=%c - %m%n

Log4j 會從 class path 中尋找 log4j.properties,並自動讀取其中的設定。

一般的使用方法 : 為 Root logger 設定 DEBUG 等級, Appender 及格式。其它的 logger 不做其它設定;當程式要轉換為 debug 或 release 模式時,只需修改 Root Logger 的等級即可。
使用範例 :
package yc.usingLog4j;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class UsingLog4j {
  private static Logger logger = Logger.getLogger(UsingLog4j.class);

  public static void main(String[] args) {
      BasicConfigurator.configure();

      /* 改變 Root Logger 的等級為 INFO */
      //Logger.getRootLogger().setLevel(Level.INFO);

      /* 鴨子類別庫的 client 只做 INFO 等級的 log;類別庫裡才使用 DEBUG 等級的 log. */
      logger.info("Create a Redhead Duck.");
      RedheadDuck rhd = new RedheadDuck(new FlyWithWings(), new Quack());
      logger.info("Play with the duck.");
      rhd.display();
      rhd.performFly();
      rhd.performQuack();

      logger.info("Create a RubberDuck.");
      RubberDuck rbd = new RubberDuck(new FlyWithRocket(), new Squeak());
      logger.info("Play with the duck.");
      rbd.display();
      rbd.performFly();
      rbd.performQuack();
      }
  }

  interface FlyBehavior {
      public void fly();
  }

  class FlyWithWings implements FlyBehavior {
      private static Logger logger = Logger.getLogger(FlyWithWings.class);

      public void fly() {
      logger.debug("Fly with wings...");
  }
}

class FlyWithRocket implements FlyBehavior {
  private static Logger logger = Logger.getLogger(FlyWithRocket.class);

  public void fly() {
      logger.debug("Fly with a rocket...");
  }
}

interface QuackBehavior {
  public void quack();
}

class Quack implements QuackBehavior {
  private static Logger logger = Logger.getLogger(Quack.class);

  public void quack() {
      logger.debug("Quack...");
  }
}

class Squeak implements QuackBehavior {
  private static Logger logger = Logger.getLogger(Squeak.class);

  public void quack() {
      logger.debug("Squeak...");
  }
}

abstract class Duck {
  private FlyBehavior flyBehavior;

  private QuackBehavior quackBehavior;

  public Duck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
      this.flyBehavior = flyBehavior;
      this.quackBehavior = quackBehavior;
  }

  public void performQuack() {
      this.quackBehavior.quack();
  }

  public void performFly() {
   this.flyBehavior.fly();
  }

  public abstract void display();
}

class RedheadDuck extends Duck {
  private static Logger logger = Logger.getLogger(RedheadDuck.class);

  public RedheadDuck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
      super(flyBehavior, quackBehavior);
  }

  @Override
  public void display() {
      logger.debug("A RedheadDuck is showing up...");
  }
}

class RubberDuck extends Duck {
  private static Logger logger = Logger.getLogger(RubberDuck.class);

  public RubberDuck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
      super(flyBehavior, quackBehavior);
  }

  @Override
  public void display() {
      logger.debug("A RubberDuck is showing up...");
  }
}

在一般情況下運行時所得到的 log message :
0 [main] INFO yc.usingLog4j.UsingLog4j  - Create a Redhead Duck.
16 [main] INFO yc.usingLog4j.UsingLog4j  - Play with the duck.
16 [main] INFO yc.usingLog4j.UsingLog4j  - Create a RubberDuck.
16 [main] INFO yc.usingLog4j.UsingLog4j  - Play with the duck.

而在除錯模式下則是 :
0 [main] INFO yc.usingLog4j.UsingLog4j  - Create a Redhead Duck.
109 [main] INFO yc.usingLog4j.UsingLog4j  - Play with the duck.
109 [main] DEBUG yc.usingLog4j.RedheadDuck  - A RedheadDuck is showing up...
109 [main] DEBUG yc.usingLog4j.FlyWithWings  - Fly with wings...
109 [main] DEBUG yc.usingLog4j.Quack  - Quack...
109 [main] INFO yc.usingLog4j.UsingLog4j  - Create a RubberDuck.
125 [main] INFO yc.usingLog4j.UsingLog4j  - Play with the duck.
125 [main] DEBUG yc.usingLog4j.RubberDuck  - A RubberDuck is showing up...
125 [main] DEBUG yc.usingLog4j.FlyWithRocket  - Fly with a rocket...
125 [main] DEBUG yc.usingLog4j.Squeak  - Squeak...


原文出處:[JAVA] Log4J @ 過太爽的日子 :: 隨意窩 Xuite日誌
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼] log4j Logging 級別

Logging 級別

org.apache.Log4j.Level 類定義了日誌級別,您可通過繼承 Level 類定制自己的級別。

級別描述
ALL所有級別,包括定制級別。
DEBUG指明細緻的事件信息,對調試應用最有用。
ERROR指明錯誤事件,但應用可能還能繼續運行。
FATAL指明非常嚴重的錯誤事件,可能會導致應用終止執行。
INFO指明描述信息,從粗粒度上描述了應用運行過程。
OFF最高級別,用於關閉日誌。
TRACE比 DEBUG 級別的粒度更細。
WARN指明潛在的有害狀況。

級別是如何工作的?

在一個級別為 q 的 logger 對像中,一個級別為 p 的日誌請求在 p >= q 的情況下是開啟的。該規則是 Log4j 的核心,它假設級別是有序的。對於標準級別,其順序為:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

下面的例子展示了如何過濾 DEBUG 和 INFO 級別的日誌。改程序使用 logger 對象的 setLevel(Level.X) 方法設置期望的日誌級別:

該例子會打印出除過 DEBUG 和 INFO 級別外的所有信息:


import org.apache.Log4j.*;
public class LogClass {
private static org.apache.Log4j.Logger log = Logger.getLogger(LogClass.class);
public static void main(String[] args) {
log.setLevel(Level.WARN);
log.trace("Trace Message!");
log.debug("Debug Message!");
log.info("Info Message!");
log.warn("Warn Message!");
log.error("Error Message!");
log.fatal("Fatal Message!");
}
}

編譯並運行 LogClass,會產生如下輸出:


Warn Message!
Error Message!
Fatal Message!

使用配置文件設置日誌級別

Log4j 提供了基於配置文件設置日誌級別的功能,當您需要改變調試級別時,不用再去修改代碼了。

下面這個例子和上面那個例子功能一樣,不過不用使用 setLevel(Level.WARN) 方法,只需修改配置文件:


# Define the root logger with appender file
log = /usr/home/Log4j
Log4j.rootLogger = WARN, FILE
# Define the file appender
Log4j.appender.FILE=org.apache.Log4j.FileAppender
Log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
Log4j.appender.FILE.layout=org.apache.Log4j.PatternLayout
Log4j.appender.FILE.layout.conversionPattern=%m%n

現在使用如下程序:


import org.apache.Log4j.*;
public class LogClass {
private static org.apache.Log4j.Logger log = Logger.getLogger(LogClass.class);
public static void main(String[] args) {
log.trace("Trace Message!");
log.debug("Debug Message!");
log.info("Info Message!");
log.warn("Warn Message!");
log.error("Error Message!");
log.fatal("Fatal Message!");
}
}

編譯並運行如下程序,會在 /usr/home/Log4j/log.out 文件內生成如下內容:


Warn Message!
Error Message!
Fatal Message!


原文出處:Logging 级别 - Log4j 教程 - 极客学院Wiki
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼] log4j 教學筆記(八) DailyRollingFileAppender

log4j教學筆記(八)DailyRollingFileAppender

本範例的log4j為1.2.17,若看不太懂要先去看之前的範例。

順序為 環境設定log的檔案輸出log4j.xmlRollingFileAppender

 

-------------

緊接著 FileAppenderRollingFileAppender之後,再來要介紹的是
DailyRollingFileAppender

從DailyRollingFileAppender的名稱就知道和時間日期有關。

DailyRollingFileAppender可以依照需求來設定log輸出檔案的時間週期,例如每個月,每個小時,每天或每分鐘等。

log4j.xml的設定類似RollingFileAppender。

 

本範例的專案目錄結構如下,同RollingFileAppender。

MainTest.java用來執行程式,log4j.xml為設定log輸出的位置其樣式等。

 

我把MainTest.java中的log訊息改得簡單一點 ...

...

 

log4j.xml ...

...

說明

參數 encoding用來設定log訊息輸出的編碼,這邊用的是 UTF-8 (line 8)


DatePattern是DailyRollingFileAppender的一個重要參數,用來設定檔案輸出的週期,本範例設定為每分鐘輸出新的log檔案 (line 10)。 

DatePattern的週期

注意DatePattern的值中不可使用冒號" :"。至於不需處理的文字要放在單引號" '"內。

DailyRollingAppender只能將日期格式放在檔案名稱後,無法放在檔案名稱前 (這點真爛)

 

此範例將 layout設為 PatternLayout,因此要在其內給定ConversionPattern的格式(format),也就是log輸出的格式 (line 11 ~ line 13)

 


log4j.xml設定完後就可以執行MainTest.java來看看結果,執行完後會在專案目錄下多個"log.out"的log檔。(log檔的輸出位置請參考 前範例)

 

和之前範例一樣,將"log.out"檔案名稱改為"log.out.txt"來用記事本開啟

 

DailyRollingFileAppender的第一個log檔並不會加上DatePattern的樣式,必須在下一次週期產生的log檔才會加上DatePattern的樣式。

本範例設定的週期為每分鐘輸出一個新的log檔,所以在第一次執行完隔一分鐘後再執行一次,就會多一個新的log.out加上DatePattern設定的日期格式。

記得執行前必須先將剛修改的"log.out.txt"改回"log.out",否則又會重新輸出一個"log.out"檔案。

 

把兩個檔案名稱後加上".txt"用記事本開啟,會發現最後輸出的log訊息會在"log.out"內,而第一次輸出的log訊息會在有DatePattern的log.out檔案中(範例中的"log.out.2015-10-29-11-02")。

而且仔細看,DatePattern的時間不是最後執行的時間,而是第一次執行的時間,因此結論是最新的log訊息會輸出在沒有DatePattern的那個log檔,而舊的訊息會放在有當初執行時間的log檔

(如果你覺得這段敘述讓你看得昏昏欲睡的話,直接執行程式來觀察會比較清楚:p)

 

和RollingFileAppender比較起來,DailyRollingFileAppender好用多了 :-)。

 

文章參考於

亲亲宝宝(中華人民共和國人民的博客)

wiki.apache.org/logging-log4j/


原文出處:log4j教學筆記(八)DailyRollingFileAppender @ 菲比傻大姐&肉豬 :: 痞客邦 PIXNET ::
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼] log4j 詳細設定

[JAVA][log4j] 詳細設定

一、Log4j簡介

Log4j有三個主要的元件:Loggers、Appenders、Layouts。

1、Loggers(寫Log )
被分為五個級別:DEBUG < INFO < WARN < ERROR < FATAL
只輸出級別不低於設定級別的訊息
ex:Loggers為INFO,則INFO、WARN、ERROR和FATAL都會輸出 DEBUG則不會

logger名稱階層關係
ex:名稱為"com.foo"的 logger 是名稱為"com.foo.Bar"的 logger的parent
程式中具名取得logger的方法是
Logger.getLogger(String name)  //名稱相同取得的logger一定一樣,不同則產生新的
通常我們用  Logger.getLogger(myApp.class) 取得loggger,名稱為程式的class  name,因此層級關係跟package層級關係吻合...

有一個最上層的root logger,root logger 一定存在的,且只能以 Logger.getRootLogger()方式取得它的參考.不能以具名方式取得.

2、Appenders(log訊息的終點(目的地))

常使用的類如下:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
org.apache.log4j.RollingFileAppender(文件大小到達指定size的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日誌訊息以輸出流格式發送到任意指定的地方)

如 System.out.println("Some message..."), 對Log4j 而言appenders 就是 console


配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1

log4j.appender.appenderName.OptionN = valueN

3、Layouts( Log訊息的格式 )

常使用的類如下:

org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌訊息的級別和訊息字符串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等訊息)

配置模式:

log4j.appender.appenderName.layout =className
log4j.appender.appenderName.layout.Option1 = value1

log4j.appender.appenderName.layout.OptionN = valueN



二、簡單範例


log4j.rootLogger=Info, A1, A2


# A1 is set to be a ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n

# A2 is set to be a file
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n
log4j.appender.A2.File=./log/gpserver-${log4j.date}.log




三、配置詳解


配置文件事實上也就是對Logger、Appender及Layout進行相應設定。
Log4j支援兩種配置文件格式,一種是XML格式的文件,一種是properties屬性文件。

下面以properties屬性文件為例介紹log4j.properties的配置。

1、配置根Logger:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
log4j.additivity.org.apache=false:表示Logger不會在父Logger的appender裡輸出,默認為true。

level :設定日誌記錄的最低級別,可設的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別,
ex:Loggers為INFO,則INFO、WARN、ERROR和FATAL都會輸出 DEBUG則不會

appenderName:指定log訊息要輸出到哪裡。可以同時指定多個輸出目的地,用逗號隔開。
例如:log4j.rootLogger=INFO,A1,B2,C3

2、配置appender:
log4j.appender.appenderName = className
appenderName:自定義appderName,在log4j.rootLogger設置中使用;
className:可設值如下:
   (1)org.apache.log4j.ConsoleAppender(控制台)
   (2)org.apache.log4j.FileAppender(文件)
   (3)org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
   (4)org.apache.log4j.RollingFileAppender(文件大小到達指定大小的時候產生一個新的文件)
   (5)org.apache.log4j.WriterAppender(將日誌訊息以輸出流格式發送到任意指定的地方)


Appender 的設定亦會反映在 Logger 的階層中。
當 Logger 輸出一筆 log message 時,父階層的 Appender 和自己的 Appender(如果有的話)都會記錄到這筆 log message;

例如"com.foo" Logger 有一個 Appender 將 log message 輸出到 console,
而 "com.foo.bar" 有一個 Appender 將 log message 輸出到檔案;
當 "com.foo.bar" Logger 輸出一筆 log message 時, console 和檔案都會出現這筆 log message。

而最簡單的例子,就是當 root logger 擁有一個輸出到 console 的 Appender 時,
則程式中所有的 logger 所產生的 log message 都會輸出到 console。
唯一個例外的情況,是當某個 logger 將自己的 additivity 屬性設為 false(Logger.setAdditivity(false)),
則此 logger 與隸屬於它的子 logger 都不會將 log message 寫到 console。


(1)ConsoleAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,預設為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Target=System.err:預設值是System.out。

(2)FileAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,默認為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Append=false:true表示訊息增加到指定文件中,false則將消息覆蓋指定的文件內容,預設值是true。
File=D:/logs/logging.log4j:指定訊息輸出到logging.log4j文件中。

(3)DailyRollingFileAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,預設為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Append=false:true表示訊息增加到指定文件中,false則將消息覆蓋指定的文件內容,預設值是true。
File=D:/logs/logging.log4j:指定訊息輸出到logging.log4j文件中。
DatePattern='.'yyyy-MM:即每月產生一個新的日誌文件。
若目前月的日誌文件名為logging.log4j,前一個月的日誌文件名會為為logging.log4j.yyyy-MM
另外,也可以指定按周、天、時、分等來滾動日誌文件,對應的格式如下:
1)'.'yyyy-MM:每月
2)'.'yyyy-ww:每週
3)'.'yyyy-MM-dd:每天
4)'.'yyyy-MM-dd-a:每天兩次
5)'.'yyyy-MM-dd-HH:每小時
6)'.'yyyy-MM-dd-HH-mm:每分鐘

若要有副檔名:
'_'yyyy-MM-dd'.log'


(4)RollingFileAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,預設為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Append=false:true表示訊息增加到指定文件中,false則將消息覆蓋指定的文件內容,預設值是true。
File=D:/logs/logging.log4j:指定訊息輸出到logging.log4j文件中。
MaxFileSize=100KB:單位可以是KB, MB 或者GB。在日誌文件到達該大小時,將會自動變更,即將原來的內容移到logging.log4j.1文件中。
MaxBackupIndex=2:指定可以產生的變動文件的最大數,例如,設為2則可以產生logging.log4j.1,logging.log4j.2兩個變動文件和一個logging.log4j文件。

3、配置日誌訊息的輸出格式(Layout):
log4j.appender.appenderName.layout=className
className:可設值如下:
(1)org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
(2)org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
(3)org.apache.log4j.SimpleLayout(包含日誌訊息的級別和訊息字符串)
(4)org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等訊息)

Layout 亦會反映在 Logger 的階層上。

(1)HTMLLayout選項:
LocationInfo=true:輸出java文件名稱和行號,預設值是false。
Title=My Logging: 預設值是Log4J Log Messages。

(2)PatternLayout選項:
ConversionPattern=%m%n:設定以怎樣的格式顯示訊息。

例如,為 Logger 加入一個 conversion pattern 為 "%r [%t] %-5p %c - %m%n" 的 PatternLayout,則輸出的 log message 就可能會像下列這樣:

176 [main] INFO org.foo.Bar - Located nearest gas station.


格式字元說明:
# %c 輸出日誌訊息所屬的類別的全名
# %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
# %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。相當於%c.%M(%F:%L)的組合包括類別全名、method、檔案名以及行數例如:test.TestLog4j.main(TestLog4j.java:10)
# %m 輸出的訊息,如log(message)中的message。
# %n 輸出一個換行符號。
# %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %t 輸出產生該日誌事件的執行緒名。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %f 輸出日誌訊息所屬的類別的類別名。
# %M 輸出產生日誌的方法名。
# %F 輸出日誌時所在的檔案名稱。
# %L 輸出行號。
# %x 輸出和當前執行緒相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。
# %% 輸出一個"%"字符。

另外,也可以在%與格式字符之間加上修飾符來控制其最小長度、最大長度、對齊方式。如:
1) c:指定輸出category的名稱,最小的長度是20,如果category的名稱長度小於20的話,預設的情況下右對齊。
2)%-20c:"-"號表示左對齊。
3)%.30c:指定輸出category的名稱,最大的長度是30,如果category的名稱長度大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會補空格。



範例

Log4j配置文件實現了輸出到控制台(console)、logFile、rollingFile、發送日誌郵件、輸出到資料庫日誌表、自定義標籤等

log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true

# 控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 日誌文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# rollingFile
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 定期變更檔案(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 應用於socket
log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true
# Set up for Log Factor 5
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 發送日誌到指定郵件
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 應用於資料庫
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 自定義Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n




http://blog.sina.com.cn/s/blog_56fd58ab0100tcna.html
http://polinwei.blogspot.tw/2008/10/java-log4j.html
http://blog.xuite.net/chihho32/blog/9121126-%5BJAVA%5D+Log4J
http://www.ewdna.com/2009/11/javalog4j.html
http://www.91linux.com/html/article/program/java/20081226/15013.html




原文出處:i-memo: [JAVA][log4j] 詳細設定
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Logging properties file

Logging properties file

The Dgraph HDFS Agent has a default Log4j configuration file that sets its logging properties.

The file is named log4j.properties and is located in the $DGRAPH_HOME/dgraph-hdfs-agent/lib directory.

The log file is a rolling log file. The default version of the file is as follows:
log4j.rootLogger=INFO, ROLLINGFILE
#
# Add ROLLINGFILE to rootLogger to get log file output
# Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=oracle.core.ojdl.log4j.OracleAppender
log4j.appender.ROLLINGFILE.ComponentId=DgraphHDFSAgent
log4j.appender.ROLLINGFILE.Path=${logfilename}
log4j.appender.ROLLINGFILE.Format=ODL-Text
log4j.appender.ROLLINGFILE.MaxSegmentSize=10485760
log4j.appender.ROLLINGFILE.MaxSize=1048576000
log4j.appender.ROLLINGFILE.Encoding=UTF-8
log4j.appender.ROLLINGFILE.layout = org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

The file defines the ROLLINGFILE appenders for the root logger and also sets the log level for the file.

The file has the following properties:

Logging propertyDescription
log4j.rootLogger The level of the root logger is defined as INFO and attaches the ROLLINGFILE appender to it.

You can change the log level, but do not change the ROLLINGFILE appender.

log4j.appender.ROLLINGFILE Sets the appender to be OracleAppender. This defines the ODL (Oracle Diagnostics Logging) format for the log entries.

Do not change this property.

log4j.appender.ROLLINGFILE.ComponentId Sets DgraphHDFSAgent
as the name of the component that generates the log messages.

Do not change this property.

log4j.appender.ROLLINGFILE.Path Sets the path for the log files. The ${logfilename} variable picks up the path from the Dgraph HDFS Agent --out flag used at start-up time.

Do not change this property.

log4j.appender.ROLLINGFILE.Format Sets ODL-Text as the formatted string as specified by the conversion pattern.

Do not change this property.

log4j.appender.ROLLINGFILE.MaxSegmentSize Sets the maximum size (in bytes) of the log file. When the dgraphHDFSAgent.out file reaches this size, a rollover file is created. The default is 10485760 (about 10 MB).
log4j.appender.ROLLINGFILE.MaxSizeSets the maximum amount of disk space to be used by the dgraphHDFSAgent.out file and the logging rollover files. The default is 1048576000 (about 1GB).
log4j.appender.ROLLINGFILE.Encoding Sets character encoding for the log file. The default UTF-8 value prints out UTF-8 characters in the file.
log4j.appender.ROLLINGFILE.layout Sets the org.apache.log4j.PatternLayout class for the layout.
log4j.appender.ROLLINGFILE.layout.ConversionPattern Defines the log entry conversion pattern.

For the conversion characters, see: https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

Logging levels


You can change the log level by opening the properties file in a text editor and changing the level for the log4j.rootLogger property to a Java log level from the table below. This example shows how you can change the log level setting to ERROR:
log4j.rootLogger=ERROR
When writing log messages, however, the logging system converts the Java level to an ODL equivalent level. The table below The log levels (in decreasing order of severity) are:


Java Log LevelODL Log LevelMeaning
OFF N/A Has the highest possible rank and is used to turn off logging.
FATAL INCIDENT_ERROR Indicates a serious problem that may be caused by a bug in the product and that should be reported to Oracle Support. In general, these messages describe events that are of considerable importance and which will prevent normal program execution.
ERROR ERROR Indicates a serious problem that requires immediate attention from the administrator and is not caused by a bug in the product.
WARN WARNING Indicates a potential problem that should be reviewed by the administrator.
INFO NOTIFICATION A message level for informational messages. This level typically indicates a major lifecycle event such as the activation or deactivation of a primary sub-component or feature. This is the default level.
DEBUG TRACE Debug information for events that are meaningful to administrators, such as public API entry or exit points.

These levels allow you to monitor events of interest at the appropriate granularity without being overwhelmed by messages that are not relevant. When you are initially setting up your application in a development environment, you might want to use the INFO level to get most of the messages, and change to a less verbose level in production.



原文出處:OracleDoc:Logging properties file
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|