3

我有一个在 NetBeans 中实现的 GUI 应用程序。对于用户输入提供的各种功能,使用了一个 jar,它使用 log4j 进行日志记录。一切都很好,但我必须将信息从 log4j 重定向到我的 GUI 中的文本区域。我发现要从 log4j 重定向到摆动文本区域,必须扩展 AppenderSkeleton。我的问题是我不能修改 gui(例如,有一个扩展 AppenderSkeleton 的 JTextArea)所以我必须有一个附加到我的 JTextarea 的类。现在我的应用程序在之前初始化日志4j。我的问题是我找不到将属性设置为 AppenderSkeleton 自定义类的方法,即对我的 gui 的 jtextarea 的引用,这样当 log4j 初始化 appender 时,它将传递对应用程序文本区域的引用。我在 log4J 配置文件中尝试了类似: log4j.appender.myAppender.theTextArea=path.to.myFrameclass.theTextArea 跳跃 log4j 会调用我的 appender 中的 setter 和我的 frame 中的 getter 来设置文本区域,但确实如此不行。如何使 log4j 初始化 appender,将信息重定向到我的应用程序?或者有没有办法让我的应用程序初始化自定义附加程序并通知 log4j 使用它进行日志记录?谢谢!

4

2 回答 2

4

最简单的选项是在 GUI 初始化后以编程方式添加附加程序。像这样的东西:

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;
        }
    }
});
于 2010-09-10T21:18:45.837 回答
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;
        }
    
    }
    
于 2011-09-01T12:40:16.227 回答