Added STDERR log level and appropriate infrastructure to capture
System.err.println(). This is reported in the debug dialog and in bug reports.
This commit is contained in:
parent
bd3c68131a
commit
9bb6a4933b
@ -47,6 +47,11 @@ public enum LogLevel {
|
||||
*/
|
||||
DEBUG,
|
||||
|
||||
/**
|
||||
* Level at which redirected StdErr messages are logged
|
||||
*/
|
||||
STDERR,
|
||||
|
||||
/**
|
||||
* Level of verbose debug logging to be used in areas which are called repeatedly,
|
||||
* such as computational methods used in simulations. This level is separated to
|
||||
|
@ -56,13 +56,14 @@ public class LogbackBufferLoggerAdaptor extends AppenderBase<ILoggingEvent> {
|
||||
|
||||
private LogLine toLogLine(ILoggingEvent e) {
|
||||
LogLevel l = toORLevel(e.getLevel());
|
||||
if (SLF4JLogHelper.USER_MARKER.equals(e.getMarker()))
|
||||
if (Markers.USER_MARKER.equals(e.getMarker()))
|
||||
l = LogLevel.USER;
|
||||
if (Markers.STDERR_MARKER.equals(e.getMarker()))
|
||||
l = LogLevel.STDERR;
|
||||
Throwable t = null;
|
||||
if (e.getThrowableProxy() != null) {
|
||||
t = ((ThrowableProxy) e.getThrowableProxy()).getThrowable();
|
||||
}
|
||||
return new LogLine(l, new TraceException(), e.getMessage(), t);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -5,4 +5,5 @@ import org.slf4j.MarkerFactory;
|
||||
|
||||
public class Markers {
|
||||
public static final Marker USER_MARKER = MarkerFactory.getMarker("User");
|
||||
public static final Marker STDERR_MARKER = MarkerFactory.getMarker("StdErr");
|
||||
}
|
41
core/src/net/sf/openrocket/logging/PrintStreamToSLF4J.java
Normal file
41
core/src/net/sf/openrocket/logging/PrintStreamToSLF4J.java
Normal file
@ -0,0 +1,41 @@
|
||||
package net.sf.openrocket.logging;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
||||
public class PrintStreamToSLF4J {
|
||||
|
||||
public static PrintStream getPrintStream(String category, PrintStream orignal) {
|
||||
|
||||
final Logger logger = LoggerFactory.getLogger(category);
|
||||
|
||||
return new PrintStream(new OutputStream() {
|
||||
StringBuilder currentLine = new StringBuilder();
|
||||
|
||||
@Override
|
||||
public synchronized void write(int b) throws IOException {
|
||||
if (b == '\r' || b == '\n') {
|
||||
//Line is complete, log it
|
||||
if (currentLine.toString().trim().length() > 0) {
|
||||
String s = currentLine.toString();
|
||||
if (Character.isWhitespace(s.charAt(0))) {
|
||||
logger.trace(Markers.STDERR_MARKER, currentLine.toString());
|
||||
} else {
|
||||
logger.debug(Markers.STDERR_MARKER, currentLine.toString());
|
||||
}
|
||||
}
|
||||
currentLine = new StringBuilder();
|
||||
} else {
|
||||
//append to the line being built
|
||||
currentLine.append((char) b);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
package net.sf.openrocket.logging;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.Marker;
|
||||
import org.slf4j.MarkerFactory;
|
||||
|
||||
public class SLF4JLogHelper extends DelegatorLogger {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(SLF4JLogHelper.class);
|
||||
static final Marker USER_MARKER = MarkerFactory.getMarker("User");
|
||||
|
||||
@Override
|
||||
public void log(LogLine line) {
|
||||
super.log(line);
|
||||
switch (line.getLevel()) {
|
||||
case VBOSE:
|
||||
log.trace(line.getMessage(), line.getCause());
|
||||
break;
|
||||
case DEBUG:
|
||||
log.debug(line.getMessage(), line.getCause());
|
||||
break;
|
||||
case INFO:
|
||||
log.info(line.getMessage(), line.getCause());
|
||||
break;
|
||||
case USER:
|
||||
log.info(USER_MARKER, line.getMessage(), line.getCause());
|
||||
break;
|
||||
case WARN:
|
||||
log.warn(line.getMessage(), line.getCause());
|
||||
break;
|
||||
case ERROR:
|
||||
log.error(line.getMessage(), line.getCause());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -11,6 +11,7 @@ import net.sf.openrocket.l10n.ResourceBundleTranslator;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.logging.LogLevel;
|
||||
import net.sf.openrocket.logging.PrintStreamLogger;
|
||||
import net.sf.openrocket.logging.PrintStreamToSLF4J;
|
||||
import net.sf.openrocket.plugin.PluginModule;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
@ -85,79 +86,15 @@ public class GuiceStartup {
|
||||
|
||||
|
||||
/**
|
||||
* Initializes the loggins system.
|
||||
* Initializes the logging system.
|
||||
*/
|
||||
public static void initializeLogging() {
|
||||
/*DelegatorLogger delegator = new DelegatorLogger();
|
||||
|
||||
// Log buffer
|
||||
LogLevelBufferLogger buffer = new LogLevelBufferLogger(LOG_BUFFER_LENGTH);
|
||||
delegator.addLogger(buffer);
|
||||
|
||||
// Check whether to log to stdout/stderr
|
||||
PrintStreamLogger printer = new PrintStreamLogger();
|
||||
boolean logout = setLogOutput(printer, System.out, System.getProperty(LOG_STDOUT_PROPERTY), null);
|
||||
boolean logerr = setLogOutput(printer, System.err, System.getProperty(LOG_STDERR_PROPERTY), LogLevel.ERROR);
|
||||
if (logout || logerr) {
|
||||
delegator.addLogger(printer);
|
||||
}
|
||||
|
||||
// Set the loggers
|
||||
Application.setLogger(delegator);
|
||||
Application.setLogBuffer(buffer);
|
||||
|
||||
// Initialize the log for this class
|
||||
log = Application.getLogger();
|
||||
log.info("Logging subsystem initialized");
|
||||
String str = "Console logging output:";
|
||||
for (LogLevel l : LogLevel.values()) {
|
||||
PrintStream ps = printer.getOutput(l);
|
||||
str += " " + l.name() + ":";
|
||||
if (ps == System.err) {
|
||||
str += "stderr";
|
||||
} else if (ps == System.out) {
|
||||
str += "stdout";
|
||||
} else {
|
||||
str += "none";
|
||||
}
|
||||
}
|
||||
str += " (" + LOG_STDOUT_PROPERTY + "=" + System.getProperty(LOG_STDOUT_PROPERTY) +
|
||||
" " + LOG_STDERR_PROPERTY + "=" + System.getProperty(LOG_STDERR_PROPERTY) + ")";
|
||||
log.info(str);
|
||||
|
||||
|
||||
//Replace System.err with a PrintStream that logs lines to DEBUG, or VBOSE if they are indented.
|
||||
//If debug info is not being output to the console then the data is both logged and written to
|
||||
//stderr.
|
||||
final boolean writeToStderr = !(printer.getOutput(LogLevel.DEBUG) == System.out || printer.getOutput(LogLevel.DEBUG) == System.err);
|
||||
final PrintStream stdErr = System.err;
|
||||
System.setErr(new PrintStream(new OutputStream() {
|
||||
StringBuilder currentLine = new StringBuilder();
|
||||
|
||||
@Override
|
||||
public synchronized void write(int b) throws IOException {
|
||||
if (writeToStderr) {
|
||||
//Write to real stderr
|
||||
stdErr.write(b);
|
||||
}
|
||||
if (b == '\r' || b == '\n') {
|
||||
//Line is complete, log it
|
||||
if (currentLine.toString().trim().length() > 0) {
|
||||
String s = currentLine.toString();
|
||||
if (Character.isWhitespace(s.charAt(0))) {
|
||||
log.verbose(currentLine.toString());
|
||||
} else {
|
||||
log.debug(currentLine.toString());
|
||||
}
|
||||
}
|
||||
currentLine = new StringBuilder();
|
||||
} else {
|
||||
//append to the line being built
|
||||
currentLine.append((char) b);
|
||||
}
|
||||
}
|
||||
}));
|
||||
*/
|
||||
System.setErr(PrintStreamToSLF4J.getPrintStream("STDERR", stdErr));
|
||||
}
|
||||
|
||||
private static boolean setLogOutput(PrintStreamLogger logger, PrintStream stream, String level, LogLevel defaultLevel) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user