【问题标题】:log4j redirection to desktop application in swinglog4j 重定向到 Swing 中的桌面应用程序
【发布时间】:2011-04-10 21:14:26
【问题描述】:

我有一个正在运行的 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 和我的框架中的 getter 来设置文本区域,但它不起作用。 如何使 log4j 初始化附加程序,将信息重定向到我的应用程序? 或者有没有办法让我的应用程序初始化自定义附加程序并通知 log4j 使用它进行日志记录? 谢谢!

【问题讨论】:

    标签: java swing logging log4j appender


    【解决方案1】:

    最简单的选择是在 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;
            }
        }
    });
    

    【讨论】:

    • 我做了一个类 myTextAppender extends AppenderSkeleton{ JTextArea area; //textarea的getter和setter}.当 gui 初始化时,我执行 myTextAppender a = new myTextAppender(); a.setArea(this.getTextArea());Logger.getRootLogger().addAppender(a);但我得到 log4j:ERROR Could not find value for key log4j.appender.WINDOW in the log4j。我做错了什么?
    • @Russ:我删除了 log4J 配置文件,它可以工作。有没有办法只附加 INFO 而不是 WARNING 的日志消息?
    • 是的,这应该可以工作:yourTextAreaAppender.setThreshold(Level.INFO);
    • @Russ:我试过了。 I 打印所有 INFO 级别及更高级别的消息。有没有办法只附加 INFO 消息(也不是 WARN 或 ERROR 级别)?
    • 是的,使用过滤器 - 我已将其添加到问题中以启用语法突出显示。
    【解决方案2】:

    这可能很简单,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 2011-11-21
      • 2010-11-15
      • 2013-05-17
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多