1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package ch.elca.el4j.services.monitoring.jmx;
18
19 import java.net.MalformedURLException;
20 import java.net.URL;
21 import java.util.Enumeration;
22 import java.util.HashMap;
23 import java.util.Iterator;
24 import java.util.LinkedList;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Set;
28
29 import javax.management.InstanceAlreadyExistsException;
30 import javax.management.MBeanRegistrationException;
31 import javax.management.MBeanServer;
32 import javax.management.MalformedObjectNameException;
33 import javax.management.NotCompliantMBeanException;
34 import javax.management.ObjectName;
35
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import org.apache.log4j.Appender;
40 import org.apache.log4j.Level;
41 import org.apache.log4j.LogManager;
42 import org.apache.log4j.helpers.Loader;
43 import org.apache.log4j.helpers.OptionConverter;
44
45 import org.springframework.beans.factory.BeanFactory;
46 import org.springframework.context.ApplicationContext;
47 import org.springframework.context.support.StaticApplicationContext;
48
49 import ch.elca.el4j.core.exceptions.BaseException;
50 import ch.elca.el4j.core.exceptions.BaseRTException;
51 import ch.elca.el4j.services.monitoring.notification.CoreNotificationHelper;
52
53
54
55
56
57
58
59
60 public class Log4jConfig implements Log4jConfigMBean {
61
62
63
64
65 public static final String JVM_DOMAIN = "JVM";
66
67
68
69
70 public static final String LOG4J_JMX_LOADER = "log4jJmxLoader";
71
72
73
74
75 private static int s_counter = 1;
76
77
78
79
80 private static Logger s_logger = LoggerFactory.getLogger(SpringBeanMB.class);
81
82
83
84
85 protected ApplicationContext m_applicationContext;
86
87
88
89
90 protected ApplicationContextMB m_applicationContextMB;
91
92
93
94
95 protected Class m_class;
96
97
98
99
100 protected BeanFactory m_beanFactory;
101
102
103
104
105 private int m_instanceCounter;
106
107
108
109
110 private MBeanServer m_mBeanServer;
111
112
113
114
115 private String m_name;
116
117
118
119
120 private ObjectName m_objectName;
121
122
123
124
125 private Map m_appendersPool;
126
127
128
129
130 private Map<String, String> m_loggingLevelCache
131 = new HashMap<String, String>();
132
133
134
135
136 private boolean m_hasRootLevelChanged = false;
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152 public Log4jConfig(String name, ApplicationContextMB acMB,
153 ApplicationContext ac, BeanFactory beanFactory,
154 MBeanServer mBeanServer) {
155
156 this.m_name = name;
157 this.m_applicationContextMB = acMB;
158 this.m_applicationContext = ac;
159 this.m_mBeanServer = mBeanServer;
160 this.m_beanFactory = beanFactory;
161 this.m_class = this.getClass();
162
163 StaticApplicationContext appContext = new StaticApplicationContext(
164 m_applicationContext);
165
166
167 appContext.getBeanFactory().registerSingleton(m_name, this);
168
169
170 setAppendersPool(((Log4jJmxLoader) appContext
171 .getBean(LOG4J_JMX_LOADER)).getAppenders());
172 }
173
174
175
176
177 public void init() throws BaseException {
178
179
180 setInstanceCounter();
181
182
183 setObjectName();
184
185
186 registerSpringBean();
187 }
188
189
190
191
192
193
194
195 protected void registerSpringBean() throws BaseException {
196
197 if (getObjectName() == null) {
198 String message = "The object name of the SpringBeanMB '"
199 + this.toString() + "' should not be null.";
200 s_logger.error(message);
201 throw new BaseRTException(message, (Object[]) null);
202 } else {
203 try {
204 m_mBeanServer.registerMBean(this, getObjectName());
205 } catch (InstanceAlreadyExistsException e) {
206 String message = "The MBean is already under the "
207 + "control of the MBean server.";
208 s_logger.error(message);
209 throw new BaseException(message, e);
210 } catch (MBeanRegistrationException e) {
211 String message = "The MBean will not be registered.";
212 s_logger.error(message);
213 throw new BaseException(message, e);
214 } catch (NotCompliantMBeanException e) {
215 String message = "This object is not a JMX compliant"
216 + " MBean.";
217 s_logger.error(message);
218 throw new BaseException(message, e);
219 }
220 }
221 }
222
223
224
225
226
227
228 public ObjectName getObjectName() {
229 return m_objectName;
230 }
231
232
233
234
235 public void setObjectName() {
236
237 String name = JVM_DOMAIN + ":name=log4jConfig " + getInstanceCounter();
238
239
240
241 try {
242 m_objectName = new ObjectName(name);
243 } catch (MalformedObjectNameException e) {
244 CoreNotificationHelper
245 .notifyMisconfiguration("The string passed as a parameter"
246 + "does not have the right format.");
247 }
248 }
249
250
251
252
253 public String getName() {
254 return m_name;
255 }
256
257
258
259
260
261 public void setAppendersPool(HashMap appenders) {
262 this.m_appendersPool = appenders;
263 }
264
265
266
267
268 public void addAppender(String category, String appenderName) {
269 LogManager.getLogger(category).addAppender(
270 (Appender) m_appendersPool.get(appenderName));
271 }
272
273
274
275
276 public void removeAppender(String category, String appenderName) {
277 LogManager.getLogger(category).removeAppender(
278 (Appender) m_appendersPool.get(appenderName));
279 }
280
281
282
283
284 public String[] getAvailableAppendersList() {
285 String[] result = null;
286 Set appKeySet = m_appendersPool.keySet();
287 Iterator i = appKeySet.iterator();
288 String appKey;
289 LinkedList<String> queue = new LinkedList<String>();
290 while (i.hasNext()) {
291 appKey = (String) i.next();
292 queue.add("appenderName=" + appKey + "; appenderObject="
293 + m_appendersPool.get(appKey).toString());
294 }
295
296 Object[] array = queue.toArray();
297 result = new String[array.length];
298 for (int j = 0; j < array.length; j++) {
299 result[j] = array[j].toString();
300 }
301
302 return result;
303 }
304
305
306
307
308 public void changeLogLevel(String category, String level) {
309 LogManager.getLogger(category).setLevel(Level.toLevel(level));
310 m_loggingLevelCache.put(category, level);
311 }
312
313
314
315
316 public Level showLogLevel(String category) {
317 return LogManager.getLogger(category).getLevel();
318 }
319
320
321
322
323 public Appender[] showAppenders(String category) {
324 Enumeration enumerator = LogManager.getLogger(category)
325 .getAllAppenders();
326
327 List<Appender> queue = new LinkedList<Appender>();
328
329 while (enumerator.hasMoreElements()) {
330 queue.add((Appender) enumerator.nextElement());
331 }
332
333 if (queue.size() > 0) {
334 return queue.toArray(new Appender[queue.size()]);
335 } else {
336 return null;
337 }
338 }
339
340
341
342
343 public void setRootLoggerLevel(String level) {
344 LogManager.getRootLogger().setLevel(Level.toLevel(level));
345 m_hasRootLevelChanged = true;
346 }
347
348
349
350
351 public String getRootLoggerLevel() {
352 return LogManager.getRootLogger().getLevel().toString();
353 }
354
355
356
357
358 public String showLogLevelCache() {
359 String result = "";
360
361 Iterator iter = m_loggingLevelCache.keySet().iterator();
362 String category;
363 while (iter.hasNext()) {
364 category = (String) iter.next();
365 result = result.concat(JmxHtmlFormatter.getXmlLog4jConfigString(
366 category, (String) m_loggingLevelCache.get(category)));
367 }
368
369 if (m_hasRootLevelChanged) {
370 result = result.concat(JmxHtmlFormatter
371 .getXMLLog4jRootTag(getRootLoggerLevel()));
372 }
373
374 return result;
375 }
376
377
378
379
380 public String getInitialConfigurationPath() {
381 String defaultConfigurationFile = "log4j.properties";
382 String defaultXMLConfigurationFile = "log4j.xml";
383 String defaultConfigurationKey = "log4j.configuration";
384 String defaultInitOverrideKey = "log4j.defaultInitOverride";
385 URL url = null;
386
387
388 String override = OptionConverter.getSystemProperty(
389 defaultInitOverrideKey, null);
390
391
392
393 if (override == null || "false".equalsIgnoreCase(override)) {
394 String configurationOptionStr = OptionConverter.getSystemProperty(
395 defaultConfigurationKey, null);
396
397
398
399
400 if (configurationOptionStr == null) {
401 url = Loader.getResource(defaultXMLConfigurationFile);
402 if (url == null) {
403 url = Loader.getResource(defaultConfigurationFile);
404 }
405 } else {
406 try {
407 url = new URL(configurationOptionStr);
408 } catch (MalformedURLException ex) {
409
410
411 url = Loader.getResource(configurationOptionStr);
412 }
413 }
414 }
415
416 if (url != null) {
417 return url.getPath();
418 } else {
419 return null;
420 }
421 }
422
423
424
425
426
427
428 public int getInstanceCounter() {
429 return m_instanceCounter;
430 }
431
432
433
434
435
436
437 public void setInstanceCounter() {
438
439 synchronized (Log4jConfig.class) {
440 m_instanceCounter = s_counter;
441 s_counter++;
442 }
443
444 }
445 }