/*
This file is part of RouteConverter.
RouteConverter is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
RouteConverter 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with RouteConverter; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Copyright (C) 2007 Christian Pesch. All Rights Reserved.
*/
package slash.common.log;
import java.io.*;
import java.util.logging.*;
import static java.util.logging.Level.*;
/**
* Allows to control log output
*
* @author Christian Pesch
*/
public class LoggingHelper {
private static PrintStream stdout = System.out, stderr = System.err;
private static final int LOG_SIZE = 5* 1024 * 1024;
private static LoggingHelper instance;
private LoggingHelper() {
}
public static LoggingHelper getInstance() {
if (instance == null)
instance = new LoggingHelper();
return instance;
}
public void logToFile() {
System.out.println("Logging to " + getLogFile().getAbsolutePath());
logAsDefault();
Logger logger = Logger.getLogger("");
try {
FileHandler handler = new FileHandler("%t/RouteConverter.log", LOG_SIZE, 1, true);
handler.setLevel(ALL);
handler.setFilter(FILTER);
handler.setFormatter(new SimpleFormatter());
logger.addHandler(handler);
} catch (IOException e) {
System.err.println("Cannot configure file logging");
e.printStackTrace();
}
// using ALL brings up a colored JavaFX WebView
// logger.setLevel(ALL);
redirectStdOutAndErrToLog();
}
public void logToConsole() {
// to avoid cycles between logging and stdout
resetStdOutAndErr();
logAsDefault();
Handler handler = new ConsoleHandler();
handler.setLevel(ALL);
handler.setFilter(FILTER);
handler.setFormatter(new SimpleFormatter());
Logger logger = Logger.getLogger("");
logger.addHandler(handler);
// using ALL brings up a colored JavaFX WebView
// logger.setLevel(ALL);
}
public void logAsDefault() {
LogManager.getLogManager().reset();
}
public String getLogFileAsString() {
logAsDefault();
File logFile = getLogFile();
String logAsString;
try {
logAsString = readFile(logFile);
} catch (IOException e) {
logAsString = "Cannot read file " + logFile + ":" + e;
}
logToFile();
return logAsString;
}
private static final Filter FILTER = new Filter() {
public boolean isLoggable(LogRecord record) {
return record.getLoggerName().startsWith("slash") ||
record.getLoggerName().startsWith("com.graphhopper");
}
};
private File getLogFile() {
return new File(System.getProperty("java.io.tmpdir"), "RouteConverter.log");
}
private String readFile(File file) throws IOException {
StringBuilder buffer = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
while (buffer.length() < LOG_SIZE) {
String line = reader.readLine();
if (line == null)
break;
buffer.append(line).append("\n");
}
}
return buffer.toString();
}
private void redirectStdOutAndErrToLog() {
Logger logger = Logger.getLogger("stdout");
LoggingOutputStream los = new LoggingOutputStream(logger, INFO);
System.setOut(new PrintStream(los, true));
logger = Logger.getLogger("stderr");
los = new LoggingOutputStream(logger, SEVERE);
System.setErr(new PrintStream(los, true));
}
private void resetStdOutAndErr() {
System.setOut(stdout);
System.setErr(stderr);
}
public static void logException(Logger log, Throwable t) {
StringWriter writer = new StringWriter();
t.printStackTrace(new PrintWriter(writer));
log.severe(writer.toString());
}
}