代码之家  ›  专栏  ›  技术社区  ›  Cratylus

在swing中log4j重定向到桌面应用程序

  •  3
  • Cratylus  · 技术社区  · 15 年前

    我在swing中有一个GUI应用程序,用NetBeans实现。对于用户输入提供的各种功能,使用jar,它使用log4j进行日志记录。一切正常,但我必须将log4j中的信息重定向到GUI中的文本区域。我发现要从log4j重定向到swing文本区域,必须扩展AppenderSkeleton。我的问题是,我不能修改gui(例如,有一个JTextArea扩展AppenderSkeleton),所以我必须有这样一个类附加到我的JTextArea。现在我的应用程序初始化 之前 我的问题是,我找不到一种方法来设置AppenderSkeleton自定义类的as属性,这是对我的gui的jtextarea的引用,这样当log4j初始化appender时,它将传递对应用程序的文本区域的引用。 我在log4J配置文件中做了如下尝试: log4j。appender.myAppender.theTextArea=路径.到.myFrameclass.theTextArea 或者我的应用程序有没有办法初始化自定义appender并通知log4j使用它进行日志记录? 谢谢您!

    2 回复  |  直到 15 年前
        1
  •  4
  •   Russ Hayward    15 年前

    最简单的选择是在初始化GUI后以编程方式添加appender。像这样:

    Logger.getRootLogger().addAppender(yourTextAreaAppender);
    

    编辑:要仅记录信息级别,请执行以下操作:

    yourTextAreaAppender.addFilter(new Filter() {
        @Override
        public int decide(LoggingEvent event) {
            if (event.getLevel().equals(Level.INFO)) {
                return ACCEPT;
            } else {
                return DENY;
            }
        }
    });
    
        2
  •  1
  •   Dario Seidl    14 年前

    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. Write是一个新类,具有以下代码:

      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;
          }
      
      }