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}