/* * Syncany, www.syncany.org * Copyright (C) 2011-2015 Philipp C. Heckel <philipp.heckel@gmail.com> * * 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 org.syncany.config; import java.io.InputStream; import java.util.Enumeration; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; /** * The logging class offers convenience functions to initialize and update the * application's log options. * * <p>In particular, it can load the log properties either from a resource or a * local file on the file system (<tt>logging.properties</tt>. If a local file is * present, it is preferred over the JAR resource. * * <p>To initialize logging, the {@link #init()} method can be called in the * <tt>static</tt> block of a class, e.g. * * <pre> * static { * Logging.init(); * } * </pre> * * @author Philipp C. Heckel <philipp.heckel@gmail.com> */ public class Logging { private static final String LOG_PROPERTIES_JAR_RESOURCE = "/" + Logging.class.getPackage().getName().replace(".", "/") + "/logging.properties"; private static AtomicBoolean loggingInitialized = new AtomicBoolean(false); public synchronized static void init() { if (loggingInitialized.get()) { return; } // Turn off unwanted loggers (evil libraries and such) disableUnwantedLoggers(); // Load logging.properties try { // Use file if exists, else use file embedded in JAR InputStream logConfigInputStream = Config.class.getResourceAsStream(LOG_PROPERTIES_JAR_RESOURCE); if (logConfigInputStream != null) { LogManager.getLogManager().readConfiguration(logConfigInputStream); } loggingInitialized.set(true); } catch (Exception e) { Logger.getAnonymousLogger().severe("Could not load logging.properties file from resource "+LOG_PROPERTIES_JAR_RESOURCE); Logger.getAnonymousLogger().severe(e.getMessage()); e.printStackTrace(); } } private static void disableUnwantedLoggers() { System.setProperty("hsqldb.reconfig_logging", "false"); if (Logger.getLogger("sun.awt.X11.timeoutTask.XToolkit") != null) { Logger.getLogger("sun.awt.X11.timeoutTask.XToolkit").setLevel(Level.OFF); } } public static void setGlobalLogLevel(Level targetLogLevel) { for (Enumeration<String> loggerNames = LogManager.getLogManager().getLoggerNames(); loggerNames.hasMoreElements(); ) { String loggerName = loggerNames.nextElement(); Logger logger = LogManager.getLogManager().getLogger(loggerName); if (logger != null) { logger.setLevel(targetLogLevel); } } for (Handler handler : Logger.getLogger("").getHandlers()) { handler.setLevel(targetLogLevel); } Logger.getLogger("").setLevel(targetLogLevel); // Make sure the unwanted loggers stay quiet disableUnwantedLoggers(); } public static void addGlobalHandler(Handler targetHandler) { Logger.getLogger("").addHandler(targetHandler); } public static void disableLogging() { LogManager.getLogManager().reset(); setGlobalLogLevel(Level.OFF); while (Logger.getLogger("").getHandlers().length > 0) { Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]); } } }