JTextArea作为log4j记录器的侦听器

v440hwme  于 2022-11-29  发布在  其他
关注(0)|答案(3)|浏览(169)

如何设置JTextArea以接收所记录得任何内容(除了创建一个接口(如“MyLoggerListener”)并将其实现到JTextArea中之外)
编辑:
我通过创建一个TextAreaOutputStream,使用它创建一个printwriter,然后在构造函数中添加一个带有printwriter的WriterAppender,修复了这个问题。

gijlo24d

gijlo24d1#

我认为@奥斯卡瑞兹的做法是一个合理的想法。
然而,我认为您应该仔细考虑是否应该尝试这样做。问题是将日志消息绘制到Java GUI中可能会占用大量CPU资源。这可能会使您的应用程序日志记录速度变慢,并可能因此扰乱您的应用程序的计时。
(Not你的应用程序应该对时间敏感。但是如果你确实有与时间相关的bug,如果改变日志级别等导致应用程序行为不同,这是没有帮助的。)
我的感觉是,在应用程序中嵌入一个花哨的日志查看器可能会比它的价值更麻烦...

iqxoj9l9

iqxoj9l92#

您可以尝试将其输出重定向到类似于Create Java console inside panel的内容
alt text http://img122.imageshack.us/img122/5692/dibujoof2.png
也就是说,您可以将控制台日志记录器(或任何名称)划分为子类,并将输出重定向到该组件。

eeq64g8w

eeq64g8w3#

我对Log4J2的解决方案如下

import java.io.Serializable;

import javax.swing.JTextArea;

import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.layout.PatternLayout;

public class TextAreaAppender extends AbstractAppender {

    private JTextArea textarea = null;
    private int maxLines;

    public TextAreaAppender(String name, Filter filter, Layout<? extends Serializable> layout, int maxLines, boolean ignoreExceptions, Property[] properties) {
        super(name, filter, layout, ignoreExceptions, properties);
        this.maxLines = maxLines;
    }

    @Override
    public void append(LogEvent event) {
        PatternLayout layout = (PatternLayout) getLayout();
        textarea.append(layout.toSerializable(event));
        if ((maxLines > 0) && (textarea.getLineCount() > (maxLines + 1))) {
            String text = textarea.getText();
            int pos = text.indexOf('\n');
            text = text.substring(pos+1);
            textarea.setText(text);
        }
    }

    public void setTextArea(JTextArea textArea) {
        this.textarea = textArea;
    }

}

使用方法如下:

PatternLayout.Builder layoutbuilder = PatternLayout.newBuilder().withPattern("%-5level %logger{36} - %msg%n");
TextAreaAppender appender = new TextAreaAppender("textLog", null, layoutbuilder.build(), 200, false, null);
appender.setTextArea(textLog);
org.apache.logging.log4j.core.Logger logger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
appender.start();
logger.addAppender(appender);

相关问题