package org.intellimate.izou.system.logger;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;
import java.io.File;
/**
* Class that manages logging in izou. Can create a new logger for every addOn
*/
public class IzouLogger {
private static final Logger rootLogger = LogManager.getRootLogger();
private final Logger fileLogger = LogManager.getLogger(this.getClass());
/**
* Creates a new file-logger for an addOn. The logger will log to a file with the addOnId as name in the logs folder
* of Izou
*
* @param addOnId the Id of the addOn the logger is created for
* @param level level of logger (at what level of log the logger should be activated
* @return the new logger
*/
public synchronized ExtendedLogger createFileLogger(String addOnId, String level) {
try {
LoggerContext ctx = LogManager.getContext(false);
Configuration config = ((org.apache.logging.log4j.core.LoggerContext) ctx).getConfiguration();
//creates a new pattern layout (what determines how the log is formated, i.e. date, thread etc.)
Layout layout = PatternLayout.createLayout("%d %-5p [%t] %C{10} (%F:%L) - %m%n", config, null, null, true,
false, null, null);
//creates a file appender for the logger (so that it knows what file to log to)
Appender fileAppender = FileAppender.createAppender("logs" + File.separator + addOnId + ".log", "true",
"false", "file", "true", "false", "false", "4000", layout, null, "false", null, config);
fileAppender.start();
config.addAppender(fileAppender);
//creates also a console appender for the logger (so that the logger also outputs the log in the console)
Appender consoleAppender = ConsoleAppender.createAppender(layout, null, "SYSTEM_OUT", "console", null, null);
consoleAppender.start();
config.addAppender(consoleAppender);
//adds appenders to an array called refs. It will later serve as references to the logger as to what
// appenders it has
AppenderRef fileRef = AppenderRef.createAppenderRef("file", Level.DEBUG, null);
AppenderRef consoleRef = AppenderRef.createAppenderRef("console", Level.DEBUG, null);
AppenderRef[] refs = new AppenderRef[]{fileRef, consoleRef};
//creates the logger configurations for the logger, where the appender-references are also added
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.DEBUG, addOnId,
"true", refs, null, config, null);
loggerConfig.addAppender(fileAppender, Level.DEBUG, null);
loggerConfig.addAppender(consoleAppender, Level.DEBUG, null);
//finally creates the logger and returns it
config.addLogger(addOnId, loggerConfig);
((org.apache.logging.log4j.core.LoggerContext) ctx).updateLoggers();
ctx.getLogger(addOnId);
ExtendedLogger logger = ctx.getLogger(addOnId);
return logger;
} catch(Exception e) {
fileLogger.error("Unable to create FileLogger",e);
return null;
}
}
}