将Log4J写入jTextArea

时间:2014-12-22 08:07:19

标签: log4j jtextarea appender

我是一位没有经验的Java开发人员,负责编写处理备份的应用程序。

我的应用程序打开一个gui(使用NetBeans模板编写的StepTwoBackup),它从用户那里收集一些信息,然后当我按下" Next"按钮,gui将这些信息传递给一个对象(使用Log4J记录所有操作的BackupRestore),然后打开另一个窗口(StepThreeBackup)并将对象传递给它。

在这个新窗口(StepThreeBackup)中,我自动为传递的对象(BackupRestore.execute())启动一个方法,该方法执行备份。 在最后一个窗口(StepThreeBackup)中,我创建了一个JTextArea,我想在其中显示Log4J的输出(当前写入日志文件并输出到控制台)。

有办法做到这一点吗?我已经读过我应该使用appender,但无法弄清楚如何正确地做到这一点。

暂时我在我的工作Log4J属性文件中创建了以下条目:

<appender name="guiAppender" class="BackupAppGui.StatusMessageAppender">
<param name="Threshold" value="INFO" />
<layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss} %5p %c{1} - %m%n"/>
</layout>
</appender>

然后我的包中的以下类(在另一篇文章之后):

包BackupAppGui;

/**
 *
 * @author MSTPA
 */
import javax.swing.JTextArea;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;


public class StatusMessageAppender extends AppenderSkeleton {
    private final JTextArea jTextA;

    public StatusMessageAppender() {
        jTextA = StepThreeBackup.getJTextA();
    }
    protected void append(LoggingEvent event) 
    {
        if(event.getLevel().equals(Level.INFO)){
        jTextA.append(event.getMessage().toString());
        }
    }
    public void close() 
    {
    }
    public boolean requiresLayout() 
    {
        return false;
    }
}

但没有任何内容写入jTextArea。

我做错了什么?有人可以帮我解决这个问题吗?感谢您提供给我的所有帮助。

1 个答案:

答案 0 :(得分:1)

您需要确保JTextArea的实例不是null。 Yoy可以尝试以编程方式添加appender(例如在创建组件后在StepThreeBackup的构造函数中):

StatusMessageAppender appender = new StatusMessageAppender();
LogManager.getRootLogger().addAppender(appender);

不要忘记删除log4j.xml文件中的条目。