001package org.intellimate.izou.system.logger;
002import org.apache.logging.log4j.Level;
003import org.apache.logging.log4j.LogManager;
004import org.apache.logging.log4j.Logger;
005import org.apache.logging.log4j.core.Appender;
006import org.apache.logging.log4j.core.Layout;
007import org.apache.logging.log4j.core.appender.ConsoleAppender;
008import org.apache.logging.log4j.core.appender.FileAppender;
009import org.apache.logging.log4j.core.config.AppenderRef;
010import org.apache.logging.log4j.core.config.Configuration;
011import org.apache.logging.log4j.core.config.LoggerConfig;
012import org.apache.logging.log4j.core.layout.PatternLayout;
013import org.apache.logging.log4j.spi.ExtendedLogger;
014import org.apache.logging.log4j.spi.LoggerContext;
015
016import java.io.File;
017
018/**
019 * Class that manages logging in izou. Can create a new logger for every addOn
020 */
021public class IzouLogger {
022    private static final Logger rootLogger = LogManager.getRootLogger();
023    private final Logger fileLogger = LogManager.getLogger(this.getClass());
024
025    /**
026     * Creates a new file-logger for an addOn. The logger will log to a file with the addOnId as name in the logs folder
027     * of Izou
028     *
029     * @param addOnId the Id of the addOn the logger is created for
030     * @param level level of logger (at what level of log the logger should be activated
031     * @return the new logger
032     */
033    public synchronized ExtendedLogger createFileLogger(String addOnId, String level) {
034        try {
035            LoggerContext ctx = LogManager.getContext(false);
036            Configuration config = ((org.apache.logging.log4j.core.LoggerContext) ctx).getConfiguration();
037
038            //creates a new pattern layout (what determines how the log is formated, i.e. date, thread etc.)
039            Layout layout = PatternLayout.createLayout("%d %-5p [%t] %C{10} (%F:%L) - %m%n", config, null, null, true,
040                    false, null, null);
041
042            //creates a file appender for the logger (so that it knows what file to log to)
043            Appender fileAppender = FileAppender.createAppender("logs" + File.separator + addOnId + ".log", "true",
044                    "false", "file", "true", "false", "false", "4000", layout, null, "false", null, config);
045            fileAppender.start();
046            config.addAppender(fileAppender);
047
048            //creates also a console appender for the logger (so that the logger also outputs the log in the console)
049            Appender consoleAppender = ConsoleAppender.createAppender(layout, null, "SYSTEM_OUT", "console", null, null);
050            consoleAppender.start();
051            config.addAppender(consoleAppender);
052
053            //adds appenders to an array called refs. It will later serve as references to the logger as to what
054            // appenders it has
055            AppenderRef fileRef = AppenderRef.createAppenderRef("file", Level.DEBUG, null);
056            AppenderRef consoleRef = AppenderRef.createAppenderRef("console", Level.DEBUG, null);
057            AppenderRef[] refs = new AppenderRef[]{fileRef, consoleRef};
058
059            //creates the logger configurations for the logger, where the appender-references are also added
060            LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.DEBUG, addOnId,
061                    "true", refs, null, config, null);
062            loggerConfig.addAppender(fileAppender, Level.DEBUG, null);
063            loggerConfig.addAppender(consoleAppender, Level.DEBUG, null);
064
065            //finally creates the logger and returns it
066            config.addLogger(addOnId, loggerConfig);
067            ((org.apache.logging.log4j.core.LoggerContext) ctx).updateLoggers();
068            ctx.getLogger(addOnId);
069            ExtendedLogger logger = ctx.getLogger(addOnId);
070            return logger;
071        } catch(Exception e) {
072            fileLogger.error("Unable to create FileLogger",e);
073            return null;
074        }
075    }
076}