/* * Copyright (C) 2014 University of Freiburg * * This file is part of SMTInterpol. * * SMTInterpol is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SMTInterpol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SMTInterpol. If not, see <http://www.gnu.org/licenses/>. */ package de.uni_freiburg.informatik.ultimate.smtinterpol; import java.io.IOException; import java.io.PrintWriter; import java.util.Formatter; public class DefaultLogger implements LogProxy { // Multithreading support private static final Object LOCK = new Object(); // Loglevel strings private static final String[] LEVELS = { "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" }; private PrintWriter mWriter = new PrintWriter(System.err); private Formatter mFormat = new Formatter(mWriter); private String mDest = "stderr"; private int mLevel = Config.DEFAULT_LOG_LEVEL; @Override public void setLoglevel(int level) { mLevel = level; } @Override public int getLoglevel() { return mLevel; } private final boolean isEnabled(int lvl) { return lvl <= mLevel; } private final void log(int lvl, Object msg) { synchronized (LOCK) { mWriter.print(LEVELS[lvl - 1]); mWriter.print(" - "); mWriter.println(msg); mWriter.flush(); } } private final void log(int lvl, String msg, Object[] params) { if (params.length == 0) { log(lvl, msg); } synchronized (LOCK) { mWriter.print(LEVELS[lvl - 1]); mWriter.print(" - "); mFormat.format(msg, params); mWriter.println(); mWriter.flush(); } } @Override public boolean isFatalEnabled() { return isEnabled(LOGLEVEL_FATAL); } @Override public void fatal(String msg, Object... params) { if (isFatalEnabled()) { log(LOGLEVEL_FATAL, msg, params); } } @Override public void fatal(Object msg) { if (isFatalEnabled()) { log(LOGLEVEL_FATAL, msg); } } @Override public void outOfMemory(String msg) { if (isFatalEnabled()) { log(LOGLEVEL_FATAL, msg); } } @Override public boolean isErrorEnabled() { return isEnabled(LOGLEVEL_ERROR); } @Override public void error(String msg, Object... params) { if (isErrorEnabled()) { log(LOGLEVEL_ERROR, msg, params); } } @Override public void error(Object msg) { if (isErrorEnabled()) { log(LOGLEVEL_ERROR, msg); } } @Override public boolean isWarnEnabled() { return isEnabled(LOGLEVEL_WARN); } @Override public void warn(String msg, Object... params) { if (isWarnEnabled()) { log(LOGLEVEL_WARN, msg, params); } } @Override public void warn(Object msg) { if (isWarnEnabled()) { log(LOGLEVEL_WARN, msg); } } @Override public boolean isInfoEnabled() { return isEnabled(LOGLEVEL_INFO); } @Override public void info(String msg, Object... params) { if (isInfoEnabled()) { log(LOGLEVEL_INFO, msg, params); } } @Override public void info(Object msg) { if (isInfoEnabled()) { log(LOGLEVEL_INFO, msg); } } @Override public boolean isDebugEnabled() { return isEnabled(LOGLEVEL_DEBUG); } @Override public void debug(String msg, Object... params) { if (isDebugEnabled()) { log(LOGLEVEL_DEBUG, msg, params); } } @Override public void debug(Object msg) { if (isDebugEnabled()) { log(LOGLEVEL_DEBUG, msg); } } @Override public boolean isTraceEnabled() { return isEnabled(LOGLEVEL_TRACE); } @Override public void trace(String msg, Object... params) { if (isTraceEnabled()) { log(LOGLEVEL_TRACE, msg, params); } } @Override public void trace(Object msg) { if (isTraceEnabled()) { log(LOGLEVEL_TRACE, msg); } } @Override public boolean canChangeDestination() { return true; } @Override public void changeDestination(String newDest) throws IOException { mWriter = ChannelUtil.createChannel(newDest); mFormat = new Formatter(mWriter); mDest = newDest; } @Override public String getDestination() { return mDest; } }