/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview 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. * * Jalview 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 Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.util; import java.util.Map; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.ConfigurationFactory; import org.apache.logging.log4j.core.config.Configurator; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder; import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; import org.apache.logging.log4j.core.filter.ThresholdFilter; import org.apache.logging.log4j.core.layout.PatternLayout; import jalview.log.JLogger; import jalview.log.JalviewAppender; public class Log4j { public final static String SIMPLE_PATTERN = "%level - %m%n"; private static boolean init = false; public static boolean isInit() { return init; } public static Level log4jLevel(JLogger.LogLevel loglevel) { return Level.toLevel(loglevel.toString()); } public static void init(JLogger.LogLevel myLevel) { init(log4jLevel(myLevel)); } public static void init(Level myLevel) { if (init) return; try { // configure the root logger to stderr ConfigurationBuilder configBuilder = Log4j .getConfigurationBuilder(); configBuilder.setStatusLevel(Level.WARN); String consoleLoggerName = "STDERR"; AppenderComponentBuilder appenderBuilder = configBuilder .newAppender(consoleLoggerName, "Console"); appenderBuilder.addAttribute("target", ConsoleAppender.Target.SYSTEM_ERR); appenderBuilder.add(Log4j.getSimpleLayoutBuilder()); appenderBuilder.add(Log4j.getThresholdFilterBuilder()); configBuilder.add(appenderBuilder); configBuilder.add(configBuilder.newRootLogger(myLevel) .add(configBuilder.newAppenderRef(consoleLoggerName))); Configurator.initialize(configBuilder.build()); init = true; } catch (Exception e) { System.err.println("Problems initializing the log4j system\n"); e.printStackTrace(System.err); } } public static Logger getLogger(String name) { return getLogger(name, Level.INFO); } public static Logger getLogger(String name, JLogger.LogLevel loglevel) { return getLogger(name, log4jLevel(loglevel)); } public static Logger getLogger(String name, Level level) { Logger logger = LogManager.getLogger(name); Log4j.setLevel(logger, level); return logger; } public static ConfigurationBuilder getConfigurationBuilder() { return ConfigurationFactory.newConfigurationBuilder(); } public static Layout getSimpleLayout() { return PatternLayout.newBuilder().withPattern(SIMPLE_PATTERN).build(); } public static LayoutComponentBuilder getSimpleLayoutBuilder() { return getConfigurationBuilder().newLayout("PatternLayout") .addAttribute("pattern", Log4j.SIMPLE_PATTERN); } public static Filter getThresholdFilter(Level level) { return ThresholdFilter.createFilter(level, Filter.Result.ACCEPT, Filter.Result.NEUTRAL); } public static FilterComponentBuilder getThresholdFilterBuilder() { return getConfigurationBuilder().newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL); } public static void setLevel(Logger logger, JLogger.LogLevel loglevel) { setLevel(logger, log4jLevel(loglevel)); } public static void setLevel(Logger logger, Level level) { if (!Platform.isJS()) { LoggerContext context = (LoggerContext) LogManager.getContext(false); Configuration config = context.getConfiguration(); LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName()); loggerConfig.setLevel(level); Map appenders = config.getAppenders(); Appender jappender = config.getAppender(JalviewAppender.NAME); context.updateLoggers(); } } public static void setRootLevel(JLogger.LogLevel loglevel) { setRootLevel(log4jLevel(loglevel)); } public static void setRootLevel(Level level) { setLevel(LogManager.getRootLogger(), level); } public static Appender getAppender(String name) { LoggerContext context = (LoggerContext) LogManager.getContext(false); Configuration config = context.getConfiguration(); Map appenders = config.getAppenders(); return appenders.get(name); } public static void addAppender(Logger logger, Logger logger2, String name2) { LoggerContext context = (LoggerContext) LogManager.getContext(false); Configuration config = context.getConfiguration(); LoggerConfig logger2Config = config.getLoggerConfig(logger2.getName()); Map logger2AppendersMap = logger2Config .getAppenders(); Appender appender = logger2AppendersMap.get(name2); addAppender(logger, appender); context.updateLoggers(); } public static void addAppender(Logger logger, Appender appender) { if (appender == null) return; LoggerContext context = (LoggerContext) LogManager.getContext(false); Configuration config = context.getConfiguration(); LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName()); if (loggerConfig == null) return; Level level = loggerConfig.getLevel(); config.addAppender(appender); loggerConfig.addAppender(appender, null, null); context.updateLoggers(); } public static void addAppenderToRootLogger(Appender appender) { Log4j.addAppender(LogManager.getRootLogger(), appender); } }