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, | 	DEBUG, | ||||||
| 	 | 	 | ||||||
|  | 	/** | ||||||
|  | 	 * Level at which redirected StdErr messages are logged | ||||||
|  | 	 */ | ||||||
|  | 	STDERR, | ||||||
|  | 	 | ||||||
| 	/** | 	/** | ||||||
| 	 * Level of verbose debug logging to be used in areas which are called repeatedly, | 	 * 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 | 	 * 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) { | 	private LogLine toLogLine(ILoggingEvent e) { | ||||||
| 		LogLevel l = toORLevel(e.getLevel()); | 		LogLevel l = toORLevel(e.getLevel()); | ||||||
| 		if (SLF4JLogHelper.USER_MARKER.equals(e.getMarker())) | 		if (Markers.USER_MARKER.equals(e.getMarker())) | ||||||
| 			l = LogLevel.USER; | 			l = LogLevel.USER; | ||||||
|  | 		if (Markers.STDERR_MARKER.equals(e.getMarker())) | ||||||
|  | 			l = LogLevel.STDERR; | ||||||
| 		Throwable t = null; | 		Throwable t = null; | ||||||
| 		if (e.getThrowableProxy() != null) { | 		if (e.getThrowableProxy() != null) { | ||||||
| 			t = ((ThrowableProxy) e.getThrowableProxy()).getThrowable(); | 			t = ((ThrowableProxy) e.getThrowableProxy()).getThrowable(); | ||||||
| 		} | 		} | ||||||
| 		return new LogLine(l, new TraceException(), e.getMessage(), t); | 		return new LogLine(l, new TraceException(), e.getMessage(), t); | ||||||
| 	} | 	} | ||||||
| 	 |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -5,4 +5,5 @@ import org.slf4j.MarkerFactory; | |||||||
| 
 | 
 | ||||||
| public class Markers { | public class Markers { | ||||||
| 	public static final Marker USER_MARKER = MarkerFactory.getMarker("User"); | 	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.l10n.Translator; | ||||||
| import net.sf.openrocket.logging.LogLevel; | import net.sf.openrocket.logging.LogLevel; | ||||||
| import net.sf.openrocket.logging.PrintStreamLogger; | import net.sf.openrocket.logging.PrintStreamLogger; | ||||||
|  | import net.sf.openrocket.logging.PrintStreamToSLF4J; | ||||||
| import net.sf.openrocket.plugin.PluginModule; | import net.sf.openrocket.plugin.PluginModule; | ||||||
| 
 | 
 | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| @ -85,79 +86,15 @@ public class GuiceStartup { | |||||||
| 	 | 	 | ||||||
| 	 | 	 | ||||||
| 	/** | 	/** | ||||||
| 	 * Initializes the loggins system. | 	 * Initializes the logging system. | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void initializeLogging() { | 	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. | 		//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 | 		//If debug info is not being output to the console then the data is both logged and written to | ||||||
| 		//stderr. | 		//stderr. | ||||||
| 		final boolean writeToStderr = !(printer.getOutput(LogLevel.DEBUG) == System.out || printer.getOutput(LogLevel.DEBUG) == System.err); |  | ||||||
| 		final PrintStream stdErr = System.err; | 		final PrintStream stdErr = System.err; | ||||||
| 		System.setErr(new PrintStream(new OutputStream() { | 		System.setErr(PrintStreamToSLF4J.getPrintStream("STDERR", stdErr)); | ||||||
| 			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); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		})); |  | ||||||
| 		*/ |  | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	private static boolean setLogOutput(PrintStreamLogger logger, PrintStream stream, String level, LogLevel defaultLevel) { | 	private static boolean setLogOutput(PrintStreamLogger logger, PrintStream stream, String level, LogLevel defaultLevel) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user