2010-09-10 22 views
3

我有一個swing應用程序的GUI應用程序,在NetBeans中實現。對於用戶輸入提供的各種功能,使用了一個jar,它使用log4j進行日誌記錄。一切正常,但我必須將信息從log4j重定向到我的GUI中的文本區域。我發現要從log4j重定向到擺動文本區域,必須擴展AppenderSkeleton。我的問題是,我不能修改gui(例如有一個擴展AppenderSkeleton的JTextArea),所以我必須有一個附加到我的JTextarea的類。現在我的應用程序在 log4j之前初始化。我的問題是我找不到一種方法來設置AppenderSkeleton自定義類的屬性,這是對我的gui的jtextarea的引用,所以當log4j初始化appender時,它將傳遞對應用程序文本區域的引用。 我在log4J配置文件中試過這樣的: log4j.appender.myAppender.theTextArea = path.to.myFrameclass.theTextArea 跳轉log4j會在我的appender中調用setter,並從我的frame中調用getter來設置文本區域,但它不起作用。 如何使appender通過log4j初始化,將信息重定向到我的應用程序? 或者有沒有辦法讓我的應用程序初始化自定義appender並通知log4j將其用於日誌記錄? 謝謝!log4j重定向到桌面應用程序

回答

4

最簡單的選擇是在GUI初始化後以編程方式添加appender。事情是這樣的:

Logger.getRootLogger().addAppender(yourTextAreaAppender); 

編輯:僅記錄INFO級別做到這一點:

yourTextAreaAppender.addFilter(new Filter() { 
    @Override 
    public int decide(LoggingEvent event) { 
     if (event.getLevel().equals(Level.INFO)) { 
      return ACCEPT; 
     } else { 
      return DENY; 
     } 
    } 
}); 
+0

我沒有一類myTextAppender擴展AppenderSkeleton {JTextArea的區域; // gettext和setter的textarea}。當gui初始化時,我執行myTextAppender a = new myTextAppender(); a.setArea(this.getTextArea()); Logger.getRootLogger()addAppender(a)中。但我得到log4j:錯誤無法找到log4j中的關鍵log4j.appender.WINDOW的值。我究竟做錯了什麼? – Cratylus 2010-09-10 21:33:40

+0

@Russ:我刪除了log4J配置文件,它工作。有沒有辦法只附加INFO的日誌消息而不是WARNING? – Cratylus 2010-09-10 21:42:41

+0

是的這應該工作:yourTextAreaAppender.setThreshold(Level.INFO); – 2010-09-10 21:47:21

1

嗯,這可能是非常簡單的,

  1. 指定log4j.property屬性文件,在我的情況下是:

    log4j.rootLogger=S 
    log4j.appender.S=com.ibm.nzna.projects.qit.gui.StatusMessageAppender 
    log4j.appender.S.layout=org.apache.log4j.PatternLayout 
    log4j.appender.S.layout.ConversionPattern=%m 
    
  2. 寫的是新一類用下面的代碼:

    import org.apache.log4j.AppenderSkeleton; 
    import org.apache.log4j.Level; 
    import org.apache.log4j.spi.LoggingEvent; 
    
    /** 
    * @author Ashish Tyagi 
    * 
    */ 
    public class StatusMessageAppender extends AppenderSkeleton { 
        private StatusBar statusBar = AppDefaultWin.getStatusBar(); 
        protected void append(LoggingEvent event) { 
         if(event.getLevel().equals(Level.INFO)){ 
           //here set the text of your swing component; 
           //in my case it is: statusBar.st_STATUS.setText(event.getMessage().toString()); 
         } 
        } 
    
        public void close() { 
    
        } 
        public boolean requiresLayout() { 
         return false; 
        } 
    
    }