package edu.berkeley.nlp.util;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.util.Stack;
public class Logger
{
public static interface LogInterface
{
public void logs(String s, Object... args);
public void logss(String s);
public void startTrack(String s);
public void endTrack();
public void dbg(String s);
public void err(String s);
public void err(String s, Object... args);
public void warn(String s);
public void warn(String string, Object... args);
public void logss(String string, Object... args);
}
public static class FigLogger implements LogInterface
{
public void dbg(String s)
{
LogInfo.dbg(s);
}
public void endTrack()
{
LogInfo.end_track();
}
public void err(String s)
{
LogInfo.error(s);
}
public void err(String s, Object... args)
{
LogInfo.error(s, args);
}
public void logs(String s, Object... args)
{
LogInfo.logs(s, args);
}
public void logss(String s)
{
LogInfo.logss(s);
}
public void logss(String string, Object... args)
{
LogInfo.logss(string, args);
}
public void startTrack(String s)
{
LogInfo.track(s);
}
public void warn(String s)
{
LogInfo.warning(s);
}
public void warn(String string, Object... args)
{
LogInfo.warning(string, args);
}
}
public static class SystemLogger implements LogInterface
{
private PrintStream out;
private PrintStream err;
private int trackLevel = 0;
private boolean debug = true;
public SystemLogger(PrintStream out, PrintStream err) {
this.out = out;
this.err = err;
}
public void close() {
if (out != null) {
out.close();
}
if (err != null) {
err.close();
}
}
public SystemLogger(String outFile, String errFile) throws FileNotFoundException {
this (outFile != null ? new PrintStream(new FileOutputStream(outFile)) : null,
errFile != null ? new PrintStream(new FileOutputStream(errFile)) : null);
}
public SystemLogger() {
this (System.out,System.err);
}
private Stack<Long> trackStartTimes = new Stack<Long>();
private String getIndentPrefix()
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < trackLevel; ++i)
{
builder.append("\t");
}
return builder.toString();
}
private void output(PrintStream out, String txt)
{
if (out == null) return;
String[] lines = txt.split("\n");
String prefix = getIndentPrefix();
for (String line : lines)
{
out.println(prefix + line);
}
}
public void dbg(String s)
{
if (debug) output(out, "[dbg] " + s);
}
private String timeString(double milliSecs)
{
String timeStr = "";
int hours = (int) (milliSecs / (1000 * 60 * 60));
if (hours > 0)
{
milliSecs -= hours * 1000 * 60 * 60;
timeStr += hours + "h";
}
int mins = (int) (milliSecs / (1000 * 60));
if (mins > 0)
{
milliSecs -= mins * 1000.0 * 60.0;
timeStr += mins + "m";
}
int secs = (int) (milliSecs / 1000.0);
//if (secs > 0) {
//milliSecs -= secs * 1000.0;
timeStr += secs + "s";
//}
return timeStr;
}
public void endTrack()
{
String timeStr = null;
synchronized (this)
{
trackLevel--;
double milliSecs = System.currentTimeMillis() - trackStartTimes.pop();
timeStr = timeString(milliSecs);
}
output(out,"} " + (timeStr != null ? "[" + timeStr + "]" : ""));
}
public void err(String s)
{
err.println(s);
}
public void logs(String s)
{
output(out,s);
}
public void logss(String s)
{
output(out,s);
}
public void startTrack(String s)
{
output(out,s + " {");
synchronized (this)
{
trackLevel++;
trackStartTimes.push(System.currentTimeMillis());
}
}
public void warn(String s)
{
output(err,"[warn] " + s);
}
public void logs(String s, Object... args)
{
logs(String.format(s, args));
}
public void err(String s, Object... args)
{
output(err,"[err] " + String.format(s,args));
}
public void warn(String string, Object... args)
{
warn(String.format(string, args));
}
public void logss(String string, Object... args)
{
logss(String.format(string, args));
}
}
public static class CompoundLogger implements LogInterface
{
private LogInterface[] loggers;
public CompoundLogger(LogInterface...loggers) {
this.loggers = loggers;
}
public void logs(String s, Object... args) {
for (LogInterface logger : loggers) {
logger.logs(s,args);
}
}
public void logss(String s) {
for (LogInterface logger : loggers) {
logger.logss(s);
}
}
public void startTrack(String s) {
for (LogInterface logger : loggers) {
logger.startTrack(s);
}
}
public void endTrack() {
for (LogInterface logger : loggers) {
logger.endTrack();
}
}
public void dbg(String s) {
for (LogInterface logger : loggers) {
logger.dbg(s);
}
}
public void err(String s) {
for (LogInterface logger : loggers) {
logger.err(s);
}
}
public void err(String s, Object... args) {
for (LogInterface logger : loggers) {
logger.err(s,args);
}
}
public void warn(String s) {
for (LogInterface logger : loggers) {
logger.warn(s);
}
}
public void warn(String string, Object... args) {
for (LogInterface logger : loggers) {
logger.warn(string,args);
}
}
public void logss(String string, Object... args) {
for (LogInterface logger : loggers) {
logger.logss(string,args);
}
}
}
public synchronized static void setGlobalLogger(LogInterface logger) {
instance = logger;
}
public synchronized static LogInterface getGlobalLogger() {
return instance;
}
private static LogInterface instance = new SystemLogger();
public static LogInterface i()
{
return instance;
}
public static void setFig()
{
setLogger(new FigLogger());
}
public static void setLogger(LogInterface i)
{
instance = i;
}
public static void logs(String s) {
i().logs(s);
}
// Static Logger Methods
public static void logs(String s, Object... args)
{
i().logs(s, args);
}
public static void logss(String s)
{
i().logss(s);
}
public static void startTrack(String s,Object...args)
{
i().startTrack(String.format(s,args));
}
public static void endTrack()
{
i().endTrack();
}
public static void dbg(String s)
{
i().dbg(s);
}
public static void err(String s)
{
i().err(s);
}
public static void err(String s, Object... args)
{
i().err(s, args);
}
public static void warn(String s)
{
i().warn(s);
}
public static void warn(String string, Object... args)
{
i().warn(string, args);
}
public static void logss(String string, Object... args)
{
i().logss(string, args);
}
}