log4j重定向到桌面应用程序

时间:2010-09-10 18:41:42

标签: java swing logging log4j appender

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

2 个答案:

答案 0 :(得分: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;
        }
    }
});

答案 1 :(得分: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;
        }
    
    }