Java 如何以编程方式限制Eclipse(消息)控制台的缓冲区大小?

Java 如何以编程方式限制Eclipse(消息)控制台的缓冲区大小?,java,logging,eclipse-plugin,console,Java,Logging,Eclipse Plugin,Console,我开发了一个Eclipse插件,它提供了一个监控视图,其中包含org.Eclipse.ui.console.MessageConsole的多个实例,另请参见 为了避免内存问题,我想为控制台的缓冲区设置一个最大大小,类似于“普通控制台视图”的Eclipse设置: 限制控制台输出,控制台缓冲区大小(字符) 如果超出限制,我希望我的控制台的内容被滚动,以便清除最旧的行,并在控制台中显示最新的行 =>如何设置缓冲区大小的限制MessageConsole似乎没有提供方法setBufferSize(800

我开发了一个Eclipse插件,它提供了一个监控视图,其中包含
org.Eclipse.ui.console.MessageConsole
的多个实例,另请参见

为了避免内存问题,我想为控制台的缓冲区设置一个最大大小,类似于“普通控制台视图”的Eclipse设置:

限制控制台输出,控制台缓冲区大小(字符)

如果超出限制,我希望我的控制台的内容被滚动,以便清除最旧的行,并在控制台中显示最新的行

=>如何设置缓冲区大小的限制
MessageConsole
似乎没有提供方法
setBufferSize(80000)
左右。它只提供了一个方法
clearConsole()
,而没有确定写入文本当前大小的方法

是否有提供所需功能的IOConsole的另一个实现?我在包
org.eclipse.ui.console
中找不到类似于
RollingMessageConsole
的东西:

在哪里可以找到Eclipse中用于限制控制台输出的代码

下面是将消息写入我的
MessageConsoles
的自定义Log4J appender的当前状态

package org.treez.core.console;

import java.io.IOException;
import java.io.PrintStream;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;
import org.treez.core.atom.uisynchronizing.AbstractUiSynchronizingAtom;
import org.treez.core.monitor.TreezMonitor;

/**
 * For writing to the eclipse console
 */
public class TreezConsoleAppender extends AppenderSkeleton {


    private static final String CONSOLE_NAME = "TreezConsole";

    private static MessageConsole treezConsole = null;


    @Override
    protected void append(LoggingEvent event) {

        //get formatted message
        Layout layout = this.getLayout();
        String message = layout.format(event);

        String treezMonitorId = event.getNDC();
        MessageConsole console = getConsole(treezMonitorId);

        if (console != null) {

            AbstractUiSynchronizingAtom.runUiTaskNonBlocking(() -> {

                Level level = event.getLevel();

                try (
                        MessageConsoleStream stream = console.newMessageStream();) {

                    if (level.equals(Level.WARN)) {
                        stream.setColor(TreezMonitor.ORANGE);
                    } else if (level.equals(Level.ERROR)) {
                        stream.setColor(TreezMonitor.RED);
                    }

                    stream.println(message);
                } catch (IOException exception) {
                    exception.printStackTrace();
                }

                ThrowableInformation throwableInformation = event.getThrowableInformation();

                if (throwableInformation != null) {

                    Throwable throwable = throwableInformation.getThrowable();

                    try (
                            MessageConsoleStream stream = console.newMessageStream();) {
                        if (level.equals(Level.WARN)) {
                            stream.setColor(TreezMonitor.ORANGE);
                        } else if (level.equals(Level.ERROR)) {
                            stream.setColor(TreezMonitor.RED);
                        }

                        throwable.printStackTrace(new PrintStream(stream));

                    } catch (IOException exception) {
                        exception.printStackTrace();
                    }

                }

            });

        }

    }

    @Override
    public void close() {
        //not used here
    }

    @Override
    public boolean requiresLayout() {
        return true;
    }

    /**
     * If a non-null jobId is specified: returns the console for the given jobId or null if no corresponding console has
     * been registered for the TreezMonitors. If the given jobId is null, the (single) TreezConsole is returned.
     */
    private static MessageConsole getConsole(String treezMonitorId) {
        if (treezMonitorId == null) {
            if (treezConsole == null) {
                createTreezConsole();
            }
            return treezConsole;
        } else {
            return TreezMonitor.getConsole(treezMonitorId);
        }
    }

    /**
     * Creates the console
     */
    private static void createTreezConsole() {
        IConsoleManager consoleManager = getConsoleManager();
        if (consoleManager != null) {
            IConsole[] existingConsoles = consoleManager.getConsoles();
            //check if console already exists and save it if so
            for (IConsole currentConsole : existingConsoles) {
                String currentConsoleName = currentConsole.getName();
                boolean isWantedConsole = CONSOLE_NAME.equals(currentConsoleName);
                if (isWantedConsole) {
                    treezConsole = (MessageConsole) currentConsole;
                    return;
                }
            }

            //console does not already exist: create new one
            treezConsole = new MessageConsole(CONSOLE_NAME, null);          
            consoleManager.addConsoles(new IConsole[] { treezConsole });
        }
    }

    /**
     * Gets the eclipse console manager
     */
    private static IConsoleManager getConsoleManager() {
        ConsolePlugin plugin = ConsolePlugin.getDefault();
        if (plugin != null) {
            IConsoleManager consoleManager = plugin.getConsoleManager();
            return consoleManager;
        } else {
            return null;
        }

    }


}

该限制是使用

public void setWaterMarks(int low, int high)
IOConsole
的方法(它扩展了
MessageConsole

JavaDoc说

设置此控制台的文本缓冲区大小。最高水位线 指示缓冲区中存储的最大字符数。这个 低水位线表示字符表中剩余的字符数 超过高水位线时缓冲


缓冲区大小设置隐藏在
IOConsole::setWaterMarks()
Ok中,非常感谢!我认为水印意味着某种背景图像。因此,我不认为这个方法是相关的。