/* * This file is part of JOP, the Java Optimized Processor * see <http://www.jopdesign.com/> * * Copyright (C) 2008, Benedikt Huber (benedikt.huber@gmail.com) * Copyright (C) 2010, Stefan Hepp (stefan@stefant.org). * * This program 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 3 of the License, or * (at your option) any later version. * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package com.jopdesign.common.logger; import com.jopdesign.common.config.Config; import org.apache.log4j.Appender; import org.apache.log4j.FileAppender; import org.apache.log4j.HTMLLayout; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.PropertyConfigurator; import java.io.File; import java.io.IOException; /** * @author Benedikt Huber <benedikt.huber@gmail.com> * @author Stefan Hepp <stefan@stefant.org> */ public class LogConfig { ///////////////////////////////////////////////////////////////////// // Various standard logging keys ///////////////////////////////////////////////////////////////////// /** * Logger for config related tasks */ public static final String LOG_CONFIG = "common.config"; /** * Logger for everything related to AppInfo */ public static final String LOG_APPINFO = "common.appinfo"; /** * Logger for class loading tasks */ public static final String LOG_LOADING = "common.appinfo.loading"; /** * Logger for output writing tasks */ public static final String LOG_WRITING = "common.appinfo.writing"; /** * Logger for all AppInfo structure classes (Class, Method, Field, ..) */ public static final String LOG_STRUCT = "common.appinfo.struct"; /** * Logger for code handling related tasks */ public static final String LOG_CODE = "common.appinfo.code"; /** * Logger for control flow graph and related classes */ public static final String LOG_CFG = "common.appinfo.code.cfg"; public static final String LOG_GRAPH = "common.graph"; private File errorLog; private File infoLog; public LogConfig() { } /** * Setup the logger using configuration options. * You may want to call {@link #setReportLoggers(File, File)} * first to define the report loggers. * * @param config the config settings to use. */ public void setupLogger(Config config) { boolean verbose = config.getOption(Config.VERBOSE); boolean debug = config.getOption(Config.DEBUG); boolean quiet = config.getOption(Config.QUIET); Level defaultLevel = Level.INFO; Level rootLevel = Level.DEBUG; if (debug) { defaultLevel = Level.DEBUG; rootLevel = Level.ALL; } else if ( quiet ) { defaultLevel = Level.WARN; } FilteredConsoleAppender defaultAppender; if (verbose) { defaultAppender = new FilteredConsoleAppender(new PatternLayout("%5r %-5p [%c] %m\n"), "System.err"); } else { defaultAppender = new FilteredConsoleAppender(new ConsoleLayout("%5r %-5p [%c{1}] %m\n"), "System.err"); } defaultAppender.setName("ACONSOLE"); defaultAppender.setThreshold(defaultLevel); defaultAppender.setConfig(config); defaultAppender.addWarnOnly(config.getOption(Config.SHOW_WARN_ONLY)); defaultAppender.addInfoOnly(config.getOption(Config.SHOW_INFO_ONLY)); Logger.getRootLogger().addAppender(defaultAppender); Logger.getRootLogger().setLevel(rootLevel); PropertyConfigurator.configure(config.getProperties()); } @SuppressWarnings({"ResultOfMethodCallIgnored"}) public void setReportLoggers(File errorLog, File infoLog) throws IOException { this.errorLog = errorLog; this.infoLog = infoLog; if ( errorLog != null ) { errorLog.delete(); FileAppender eapp = new FileAppender(new HTMLLayout(), errorLog.getPath()); eapp.setName("AERROR"); eapp.setThreshold(Level.WARN); Logger.getRootLogger().addAppender(eapp); } if ( infoLog != null ) { infoLog.delete(); FileAppender iapp = new FileAppender(new HTMLLayout(), infoLog.getPath()); // TODO maybe make level of info logger configurable (one of INFO, DEBUG, ALL)? iapp.setThreshold(Level.ALL); iapp.setName("AINFO"); Logger.getRootLogger().addAppender(iapp); } } public static void stopLogger() { String[] names = {"ACONSOLE", "AERROR", "AINFO"}; for ( String appender : names) { Appender app = Logger.getRootLogger().getAppender(appender); if ( app == null ) { continue; } app.close(); Logger.getRootLogger().removeAppender(app); } } public File getErrorLogFile() { return errorLog; } public File getInfoLogFile() { return infoLog; } }