package beast.core.util; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.Arrays; /** class used for logging messages from programs * Comes with 5 levels: * error, * warning, * info, * debug, * trace * * To log a message, refer to one of the streams, e.g. * Log.info.println("Hello world!"); * * or pass message directly through method * Log.info("Hello world!"); * * The former gives better control of newlines, while the latter always adds a newline to the string. **/ public class Log { static PrintStream nullStream = new PrintStream(new OutputStream() { @Override public void write(int b) throws IOException { } }); public enum Level { error, warning, info, debug, trace } static Level level = Level.info; /** return log levels as array of Strings **/ static public String [] values() { String [] values = new String[Level.values().length]; for (int i = 0; i < values.length; i++) { values[i] = Level.values()[i].toString(); } return values; } static public PrintStream err; static public void err(String msg) {err.println(msg);} static public PrintStream warning; static public void warning(String msg) {warning.println(msg);} static public PrintStream info; static public void info(String msg) {info.println(msg);} static public PrintStream debug; static public void debug(String msg) {debug.println(msg);} static public PrintStream trace; static public void trace(String msg) {trace.println(msg);} static private PrintStream errIfOpen; static private PrintStream warningIfOpen; static private PrintStream infoIfOpen; static private PrintStream debugIfOpen; static private PrintStream traceIfOpen; static { // Initialise streams here instead of when declaring the variables. // This is a static method and these are static members. // These can suffer from different orders of initialisation, depending on JVM err= System.err; warning= System.err; info = System.out; debug = System.out; trace = System.out; errIfOpen = System.err; warningIfOpen = System.err; infoIfOpen = System.out; debugIfOpen = System.out; traceIfOpen = System.out; if (System.getProperty("beast.log.level") != null) { try { level = Level.valueOf(System.getProperty("beast.log.level")); } catch (IllegalArgumentException e) { System.err.println("beast.log.level is set to " + System.getProperty("beast.log.level") + " " +"but should be one of " + Arrays.toString(Level.values())); } } setLevel(level); } final static public int ERROR = 0; final static public int WARNING = 1; final static public int INFO = 2; final static public int DEBUG = 3; final static public int TRACE = 4; /** Determines the level of logging that actually * reaches output. Only newLevel and below will * be shown, the rest is suppressed. */ static public void setLevel(Level newLevel) { level = newLevel; errIfOpen = (err == nullStream ? errIfOpen : err); warningIfOpen = (warning == nullStream ? warningIfOpen : warning); infoIfOpen = (info == nullStream ? infoIfOpen : info); debugIfOpen = (debug == nullStream ? debugIfOpen : debug); traceIfOpen = (trace == nullStream ? traceIfOpen : trace); err = nullStream; warning = nullStream; info = nullStream; debug = nullStream; trace = nullStream; switch (level) { case trace: trace = traceIfOpen; case debug: debug = debugIfOpen; case info: info = infoIfOpen; case warning: warning = warningIfOpen; case error: err = errIfOpen; } } } // Log