//----------------------------------------------------------------------------//
// //
// L o g U t i l //
// //
//----------------------------------------------------------------------------//
// <editor-fold defaultstate="collapsed" desc="hdr"> //
// Copyright © Hervé Bitteur and others 2000-2013. All rights reserved. //
// This software is released under the GNU General Public License. //
// Goto http://kenai.com/projects/audiveris to report bugs or suggestions. //
//----------------------------------------------------------------------------//
// </editor-fold>
package omr.log;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Class {@code LogUtil} handles logging features that depend on
* underlying LogBack binding.
*
* @author Hervé Bitteur
*/
public class LogUtil
{
//~ Static fields/initializers ---------------------------------------------
/** System property for LogBack configuration. */
private static final String LOGBACK_LOGGING_KEY = "logback.configurationFile";
/** File name for LogBack configuration. */
private static final String LOGBACK_FILE_NAME = "logback.xml";
//~ Methods ----------------------------------------------------------------
//------------//
// initialize //
//------------//
/**
* Check for (BackLog) logging configuration, and if not found,
* define a minimal configuration.
* This method should be called at the very beginning of the program before
* any logging request is sent.
*
* @param CONFIG_FOLDER Config folder which may contain a logback.xml file
* @param TEMP_FOLDER Temporary folder where log file should be written
*/
public static void initialize (File CONFIG_FOLDER,
File TEMP_FOLDER)
{
// 1/ Check if system property is set and points to a real file
final String loggingProp = System.getProperty(LOGBACK_LOGGING_KEY);
if (loggingProp != null) {
File configFile = new File(loggingProp);
if (configFile.exists()) {
// Everything seems OK, let LogBack use the config file
System.out.println("Using " + configFile.getAbsolutePath());
return;
} else {
System.out.println(
"File " + configFile.getAbsolutePath()
+ " does not exist.");
}
} else {
System.out.println(
"Property " + LOGBACK_LOGGING_KEY + " not defined.");
}
// 2/ Look for well-known location
File configFile = new File(CONFIG_FOLDER, LOGBACK_FILE_NAME);
if (configFile.exists()) {
System.out.println("Using " + configFile.getAbsolutePath());
// Set property for logback
System.setProperty(LOGBACK_LOGGING_KEY, configFile.toString());
return;
} else {
System.out.println("Could not find " + configFile);
}
// 3/ We need a default configuration
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(
Logger.ROOT_LOGGER_NAME);
// CONSOLE
ConsoleAppender consoleAppender = new ConsoleAppender();
PatternLayoutEncoder consoleEncoder = new PatternLayoutEncoder();
consoleAppender.setName("CONSOLE");
consoleAppender.setContext(loggerContext);
consoleEncoder.setContext(loggerContext);
consoleEncoder.setPattern("%-5level %caller{1} - %msg%ex%n");
consoleEncoder.start();
consoleAppender.setEncoder(consoleEncoder);
consoleAppender.start();
root.addAppender(consoleAppender);
// FILE (located in default temp directory)
File logFile;
FileAppender fileAppender = new FileAppender();
PatternLayoutEncoder fileEncoder = new PatternLayoutEncoder();
fileAppender.setName("FILE");
fileAppender.setContext(loggerContext);
fileAppender.setAppend(false);
String now = new SimpleDateFormat("yyyyMMdd'T'HHmmss").format(
new Date());
logFile = Paths.get(
System.getProperty("java.io.tmpdir"),
"audiveris-" + now + ".log")
.toFile();
fileAppender.setFile(logFile.getAbsolutePath());
fileEncoder.setContext(loggerContext);
fileEncoder.setPattern("%date %level \\(%file:%line\\) - %msg%ex%n");
fileEncoder.start();
fileAppender.setEncoder(fileEncoder);
fileAppender.start();
root.addAppender(fileAppender);
// GUI (filtered in LogGuiAppender)
Appender guiAppender = new LogGuiAppender();
guiAppender.setName("GUI");
guiAppender.setContext(loggerContext);
guiAppender.start();
root.addAppender(guiAppender);
// STEP
Appender stepAppender = new LogStepAppender();
stepAppender.setName("STEP");
stepAppender.setContext(loggerContext);
stepAppender.start();
root.addAppender(stepAppender);
// Levels
root.setLevel(Level.INFO);
// OPTIONAL: print logback internal status messages
StatusPrinter.print(loggerContext);
root.info("Logging to file {}", logFile.getAbsolutePath());
}
//---------//
// toLevel //
//---------//
public static Level toLevel (final String str)
{
switch (str.toUpperCase()) {
case "ALL":
return Level.ALL;
case "TRACE":
return Level.TRACE;
case "DEBUG":
return Level.DEBUG;
case "INFO":
return Level.INFO;
case "WARN":
return Level.WARN;
case "ERROR":
return Level.ERROR;
default:
case "OFF":
return Level.OFF;
}
}
}