From Gossip@Openhome

Java Gossip: 自訂 Handler

Handler負責日誌訊息的輸出目的地,在Java SE中預設有五個Handler:
  • ConsoleHandler
以 System.err 輸出記錄。
  • FileHandler
將訊息輸出至檔案
  • StreamHandler
以 OutputStream 輸出記錄。
  • SocketHandler
將訊息透過Socket傳送至遠端主機。
  • MemoryHandler
將訊息暫存在記憶體中。

如果這五個Handler還不符合您的需求,則可以自訂Handler,方法是繼承java.util.logging.Handler類別,這個類別有三個抽象方法必須重新定義:
public void publish(LogRecord logRecord);
public void flush();
public void close();

publish()方法可取得LogRecord實例,您可以使用它來取得一些與程式執行有關的日誌資訊,flush()方法用來將緩衝區中的日誌訊息出 清(如果有的話),close()方法用來關閉輸出訊息的物件(例如檔案開啟的話,可以在這邊關閉檔案),以釋放所有的相關資源。

Handler在進行輸出之前,可搭配Filter過濾訊息,你可以參考
自 訂 Filter可以直接呼叫從Handler繼承下來的isLoggable()來進行判斷,Handler的isLoggable()的實作如下:
    public boolean isLoggable(LogRecord record) {
        int levelValue = getLevel().intValue();
        if (record.getLevel().intValue() < levelValue || levelValue == offValue) {
            return false;
        }
        Filter filter = getFilter();
        if (filter == null) {   
            return true;
        }
        return filter.isLoggable(record);
    }

Handler通常搭配Formatter,Handler負責輸出,而Formatter負責格式,Formatter的自訂可以參考自訂 Formatter,java.util.logging.Handler 預設並沒有設置Formatter,在實作Handler時,Handler的setFormatter()是用來設置Formatter的,您可以在 publish()中透過getFormatter()來取得Formatter實例,進行格式化輸出,例如:
import java.util.logging.*;

public class CustomLogHandler extends Handler {
        ...
    public void publish(LogRecord logRecord) {
        if (!isLoggable(record)) {
            return;
        }

        String logMsg = getFormatter().format(logRecord);
        out.print(logMsg); // out 是您自訂的輸出目的地物件
    }

    public void flush() {
         ....
    }

    public void close() {
         ...
    }
}