2010-09-10 19 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; 
        } 
    
    }