Java 如何以编程方式限制Eclipse(消息)控制台的缓冲区大小?
我开发了一个Eclipse插件,它提供了一个监控视图,其中包含Java 如何以编程方式限制Eclipse(消息)控制台的缓冲区大小?,java,logging,eclipse-plugin,console,Java,Logging,Eclipse Plugin,Console,我开发了一个Eclipse插件,它提供了一个监控视图,其中包含org.Eclipse.ui.console.MessageConsole的多个实例,另请参见 为了避免内存问题,我想为控制台的缓冲区设置一个最大大小,类似于“普通控制台视图”的Eclipse设置: 限制控制台输出,控制台缓冲区大小(字符) 如果超出限制,我希望我的控制台的内容被滚动,以便清除最旧的行,并在控制台中显示最新的行 =>如何设置缓冲区大小的限制MessageConsole似乎没有提供方法setBufferSize(800
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中,非常感谢!我认为水印意味着某种背景图像。因此,我不认为这个方法是相关的。