/* * Eoulsan development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public License version 2.1 or * later and CeCILL-C. This should be distributed with the code. * If you do not have a copy, see: * * http://www.gnu.org/licenses/lgpl-2.1.txt * http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt * * Copyright for this code is held jointly by the Genomic platform * of the Institut de Biologie de l'École normale supérieure and * the individual authors. These should be listed in @author doc * comments. * * For more information on the Eoulsan project and its aims, * or to join the Eoulsan Google group, visit the home page * at: * * http://outils.genomique.biologie.ens.fr/eoulsan * */ package fr.ens.biologie.genomique.eoulsan; import java.util.HashMap; import java.util.Map; import java.util.logging.ConsoleHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; /** * This class allow to change the logger name for all Eoulsan classes. The * setLoggerName() method must be called before any other Eoulsan method. * @author Laurent Jourdren * @since 2.0 */ public class EoulsanLogger { private static String loggerName = Globals.APP_NAME; private static Map<String, Logger> threadGroupLoggers = new HashMap<>(); private static Logger logger; /** * Get the logger object. * @return a logger object for Eoulsan */ public static Logger getLogger() { // Search Thread logger only if thread logger has been registered if (!threadGroupLoggers.isEmpty()) { ThreadGroup tg = Thread.currentThread().getThreadGroup(); do { if (threadGroupLoggers.containsKey(tg.getName())) { return threadGroupLoggers.get(tg.getName()); } tg = tg.getParent(); } while (tg != null); } // Keep a reference of the Logger to avoid disappearance of the Handlers. // LogManager only keeps weak references to the Loggers it creates. if (logger == null) { logger = Logger.getLogger(loggerName); } return logger; } /** * Set the logger name. * @param newLoggerName the new logger name */ public static void setLoggerName(final String newLoggerName) { if (newLoggerName == null) { throw new NullPointerException("New logger name is null"); } loggerName = newLoggerName; logger = null; } /** * Get the logger name. * @return the logger name */ public static String getLoggerName() { return loggerName; } /** * Register a logger for a thread group. * @param threadGroup thread group * @param logger logger to register */ public static void registerThreadGroupLogger(final ThreadGroup threadGroup, final Logger logger) { if (threadGroup == null || logger == null) { return; } threadGroupLoggers.put(threadGroup.getName(), logger); } /** * Remove a logger for a thread group. * @param threadGroup thread group */ public static void removeThreadGroupLogger(final ThreadGroup threadGroup) { if (threadGroup == null) { return; } threadGroupLoggers.remove(threadGroup.getName()); } /** * Initialize the console logger handler for Hadoop mappers and reducers. This * method set the Eoulsan logger format and define the logger level. */ public static void initConsoleHandler() { initConsoleHandler(null); } /** * Initialize the console logger handler for Hadoop mappers and reducers. * @param level log level to use */ public static void initConsoleHandler(final Level level) { // Disable parent Handler getLogger().setUseParentHandlers(false); // Create the new console handler final Handler handler = new ConsoleHandler(); handler.setLevel(level != null ? level : Globals.LOG_LEVEL); handler.setFormatter(Globals.LOG_FORMATTER); // Add the handler to the logger getLogger().addHandler(handler); // Set the log level of the logger getLogger().setLevel(handler.getLevel()); } /** * Log an SEVERE message using <code>getLogger().severe()</code>. * @param msg The string message */ public static void logSevere(final String msg) { getLogger().severe(msg); } /** * Log an WARNING message using <code>getLogger().warning()</code>. * @param msg The string message */ public static void logWarning(final String msg) { getLogger().warning(msg); } /** * Log an INFO message using <code>getLogger().info()</code>. * @param msg The string message */ public static void logInfo(final String msg) { getLogger().info(msg); } /** * Log a CONFIG message using <code>getLogger().config()</code>. * @param msg The string message */ public static void logConfig(final String msg) { getLogger().config(msg); } /** * Log a FINER message using <code>getLogger().finer()</code>. * @param msg The string message */ public static void logFiner(final String msg) { getLogger().finer(msg); } /** * Log a FINEST message using <code>getLogger().finest()</code>. * @param message The string message */ public static void logFinest(final String message) { getLogger().finest(message); } }