Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / util / Log4j.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.util;
22
23 import java.util.Map;
24
25 import org.apache.logging.log4j.Level;
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.apache.logging.log4j.core.Appender;
29 import org.apache.logging.log4j.core.Filter;
30 import org.apache.logging.log4j.core.Layout;
31 import org.apache.logging.log4j.core.LoggerContext;
32 import org.apache.logging.log4j.core.appender.ConsoleAppender;
33 import org.apache.logging.log4j.core.config.Configuration;
34 import org.apache.logging.log4j.core.config.ConfigurationFactory;
35 import org.apache.logging.log4j.core.config.Configurator;
36 import org.apache.logging.log4j.core.config.LoggerConfig;
37 import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
38 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
39 import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder;
40 import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
41 import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
42 import org.apache.logging.log4j.core.filter.ThresholdFilter;
43 import org.apache.logging.log4j.core.layout.PatternLayout;
44
45 import jalview.log.JLogger;
46 import jalview.log.JalviewAppender;
47
48 public class Log4j
49 {
50
51   public final static String SIMPLE_PATTERN = "%level - %m%n";
52
53   private static boolean init = false;
54
55   public static boolean isInit()
56   {
57     return init;
58   }
59
60   public static Level log4jLevel(JLogger.LogLevel loglevel)
61   {
62     return Level.toLevel(loglevel.toString());
63   }
64
65   public static void init(JLogger.LogLevel myLevel)
66   {
67     init(log4jLevel(myLevel));
68   }
69
70   public static void init(Level myLevel)
71   {
72     if (init)
73       return;
74     try
75     {
76       // configure the root logger to stderr
77       ConfigurationBuilder<BuiltConfiguration> configBuilder = Log4j
78               .getConfigurationBuilder();
79
80       configBuilder.setStatusLevel(Level.WARN);
81
82       String consoleLoggerName = "STDERR";
83       AppenderComponentBuilder appenderBuilder = configBuilder
84               .newAppender(consoleLoggerName, "Console");
85       appenderBuilder.addAttribute("target",
86               ConsoleAppender.Target.SYSTEM_ERR);
87       appenderBuilder.add(Log4j.getSimpleLayoutBuilder());
88       appenderBuilder.add(Log4j.getThresholdFilterBuilder());
89       configBuilder.add(appenderBuilder);
90
91       configBuilder.add(configBuilder.newRootLogger(myLevel)
92               .add(configBuilder.newAppenderRef(consoleLoggerName)));
93
94       Configurator.initialize(configBuilder.build());
95
96       init = true;
97     } catch (Exception e)
98     {
99       jalview.bin.Console
100               .errPrintln("Problems initializing the log4j system\n");
101       e.printStackTrace(System.err);
102     }
103   }
104
105   public static Logger getLogger(String name)
106   {
107     return getLogger(name, Level.INFO);
108   }
109
110   public static Logger getLogger(String name, JLogger.LogLevel loglevel)
111   {
112     return getLogger(name, log4jLevel(loglevel));
113   }
114
115   public static Logger getLogger(String name, Level level)
116   {
117     Logger logger = LogManager.getLogger(name);
118     Log4j.setLevel(logger, level);
119     return logger;
120   }
121
122   public static ConfigurationBuilder<BuiltConfiguration> getConfigurationBuilder()
123   {
124     return ConfigurationFactory.newConfigurationBuilder();
125   }
126
127   public static Layout getSimpleLayout()
128   {
129     return PatternLayout.newBuilder().withPattern(SIMPLE_PATTERN).build();
130   }
131
132   public static LayoutComponentBuilder getSimpleLayoutBuilder()
133   {
134     return getConfigurationBuilder().newLayout("PatternLayout")
135             .addAttribute("pattern", Log4j.SIMPLE_PATTERN);
136   }
137
138   public static Filter getThresholdFilter(Level level)
139   {
140     return ThresholdFilter.createFilter(level, Filter.Result.ACCEPT,
141             Filter.Result.NEUTRAL);
142   }
143
144   public static FilterComponentBuilder getThresholdFilterBuilder()
145   {
146     return getConfigurationBuilder().newFilter("ThresholdFilter",
147             Filter.Result.ACCEPT, Filter.Result.NEUTRAL);
148   }
149
150   public static void setLevel(Logger logger, JLogger.LogLevel loglevel)
151   {
152     setLevel(logger, log4jLevel(loglevel));
153   }
154
155   public static void setLevel(Logger logger, Level level)
156   {
157     if (!Platform.isJS())
158     {
159       LoggerContext context = (LoggerContext) LogManager.getContext(false);
160       Configuration config = context.getConfiguration();
161       LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName());
162       loggerConfig.setLevel(level);
163
164       Map<String, Appender> appenders = config.getAppenders();
165
166       Appender jappender = config.getAppender(JalviewAppender.NAME);
167
168       context.updateLoggers();
169     }
170   }
171
172   public static void setRootLevel(JLogger.LogLevel loglevel)
173   {
174     setRootLevel(log4jLevel(loglevel));
175   }
176
177   public static void setRootLevel(Level level)
178   {
179     setLevel(LogManager.getRootLogger(), level);
180   }
181
182   public static Appender getAppender(String name)
183   {
184     LoggerContext context = (LoggerContext) LogManager.getContext(false);
185     Configuration config = context.getConfiguration();
186     Map<String, Appender> appenders = config.getAppenders();
187     return appenders.get(name);
188   }
189
190   public static void addAppender(Logger logger, Logger logger2,
191           String name2)
192   {
193     LoggerContext context = (LoggerContext) LogManager.getContext(false);
194     Configuration config = context.getConfiguration();
195     LoggerConfig logger2Config = config.getLoggerConfig(logger2.getName());
196     Map<String, Appender> logger2AppendersMap = logger2Config
197             .getAppenders();
198     Appender appender = logger2AppendersMap.get(name2);
199     addAppender(logger, appender);
200     context.updateLoggers();
201   }
202
203   public static void addAppender(Logger logger, Appender appender)
204   {
205     if (appender == null)
206       return;
207     LoggerContext context = (LoggerContext) LogManager.getContext(false);
208     Configuration config = context.getConfiguration();
209     LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName());
210     if (loggerConfig == null)
211       return;
212
213     Level level = loggerConfig.getLevel();
214
215     config.addAppender(appender);
216     loggerConfig.addAppender(appender, null, null);
217
218     context.updateLoggers();
219   }
220
221   public static void addAppenderToRootLogger(Appender appender)
222   {
223     Log4j.addAppender(LogManager.getRootLogger(), appender);
224   }
225 }