如何设置JTextArea以接收所记录得任何内容(除了创建一个接口(如“MyLoggerListener”)并将其实现到JTextArea中之外)编辑:我通过创建一个TextAreaOutputStream,使用它创建一个printwriter,然后在构造函数中添加一个带有printwriter的WriterAppender,修复了这个问题。
gijlo24d1#
我认为@奥斯卡瑞兹的做法是一个合理的想法。然而,我认为您应该仔细考虑是否应该尝试这样做。问题是将日志消息绘制到Java GUI中可能会占用大量CPU资源。这可能会使您的应用程序日志记录速度变慢,并可能因此扰乱您的应用程序的计时。(Not你的应用程序应该对时间敏感。但是如果你确实有与时间相关的bug,如果改变日志级别等导致应用程序行为不同,这是没有帮助的。)我的感觉是,在应用程序中嵌入一个花哨的日志查看器可能会比它的价值更麻烦...
iqxoj9l92#
您可以尝试将其输出重定向到类似于Create Java console inside panel的内容alt text http://img122.imageshack.us/img122/5692/dibujoof2.png也就是说,您可以将控制台日志记录器(或任何名称)划分为子类,并将输出重定向到该组件。
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);
3条答案
按热度按时间gijlo24d1#
我认为@奥斯卡瑞兹的做法是一个合理的想法。
然而,我认为您应该仔细考虑是否应该尝试这样做。问题是将日志消息绘制到Java GUI中可能会占用大量CPU资源。这可能会使您的应用程序日志记录速度变慢,并可能因此扰乱您的应用程序的计时。
(Not你的应用程序应该对时间敏感。但是如果你确实有与时间相关的bug,如果改变日志级别等导致应用程序行为不同,这是没有帮助的。)
我的感觉是,在应用程序中嵌入一个花哨的日志查看器可能会比它的价值更麻烦...
iqxoj9l92#
您可以尝试将其输出重定向到类似于Create Java console inside panel的内容
alt text http://img122.imageshack.us/img122/5692/dibujoof2.png
也就是说,您可以将控制台日志记录器(或任何名称)划分为子类,并将输出重定向到该组件。
eeq64g8w3#
我对Log4J2的解决方案如下
使用方法如下: