1 package org.lsst.ccs.utilities.logging;
2
3
4 import org.lsst.ccs.bootstrap.resources.BootstrapResourceUtils;
5 import org.lsst.ccs.bootstrap.resources.ResourcesUtils;
6 import org.lsst.ccs.utilities.tracers.Tracer;
7
8 import java.io.ByteArrayInputStream;
9 import java.io.ByteArrayOutputStream;
10 import java.io.IOException;
11 import java.nio.file.FileSystems;
12 import java.nio.file.Files;
13 import java.util.*;
14 import java.util.logging.*;
15 import java.util.logging.Formatter;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public class LogPropertiesLoader {
57 public static final String LOG_PROPS = "/logging.properties";
58
59
60
61
62 public static final String LOG_CONF_FILE = System.getProperty("java.util.logging.config.file", LOG_PROPS);
63
64
65
66
67
68
69 static LogManager systemLoaderLogManager;
70
71 Properties loggingProperties ;
72
73 public LogPropertiesLoader() {
74 systemLoaderLogManager = LogManager.getLogManager() ;
75
76 readInitialConfiguration();
77
78
79
80
81
82
83
84
85
86
87
88
89 public static org.lsst.ccs.utilities.beanutils.Optional<LogManager> getSystemLoaderLogManager() {
90 org.lsst.ccs.utilities.beanutils.Optional<LogManager> res = org.lsst.ccs.utilities.beanutils.Optional.empty();
91 try {
92 if (systemLoaderLogManager == null) {
93
94 Class clazz = ClassLoader.getSystemClassLoader().loadClass("org.lsst.ccs.utilities.logging" +
95 ".LogPropertiesLoader");
96 clazz.newInstance() ;
97 }
98 } catch (Exception exc) {
99 System.err.println(" ERROR " + exc);
100 }
101 res = org.lsst.ccs.utilities.beanutils.Optional.ofNullable(systemLoaderLogManager);
102 return res;
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116 void readInitialConfiguration() {
117
118 String resourceName = LOG_CONF_FILE ;
119 String dummyCheckProperty= "ccsLoaded" ;
120 if( null != systemLoaderLogManager.getProperty(dummyCheckProperty)) {
121 return ;
122 }
123 loggingProperties = ResourcesUtils.getFlatPropertiesObject(BootstrapResourceUtils.getBootstrapProperties(resourceName, this.getClass()));
124 loggingProperties.setProperty(dummyCheckProperty, "true") ;
125
126 assert Tracer.trace(loggingProperties.toString()) ;
127
128
129 Set<String> set = loggingProperties.stringPropertyNames();
130 for (String key : set) {
131
132 if (key.endsWith(".pattern")) {
133 String pattern = loggingProperties.getProperty(key);
134 try {
135 pattern = checkForFile(pattern);
136 loggingProperties.put(key, pattern) ;
137 } catch (IOException e) {
138 System.err.println("problem while creating log directory " + e);
139 }
140 break;
141 }
142 }
143
144 ByteArrayOutputStream bos = new ByteArrayOutputStream();
145 try {
146 loggingProperties.store(bos, "");
147 byte[] bytes = bos.toByteArray();
148 ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
149 systemLoaderLogManager.readConfiguration(bis);
150 handlersLazyLoad();
151 } catch (IOException e) {
152 System.err.println(" can't load properties for LogManager" + e);
153 }
154 }
155
156
157
158
159
160
161
162
163 protected void handlersLazyLoad() throws IOException {
164 Enumeration<String> loggerNames = systemLoaderLogManager.getLoggerNames() ;
165 while(loggerNames.hasMoreElements()) {
166 String loggerName = loggerNames.nextElement() ;
167
168 java.util.logging.Logger logger = systemLoaderLogManager.getLogger(loggerName) ;
169 if(logger != null) {
170 loadLoggerHandlers(loggerName, logger);
171 }
172
173 }
174 }
175
176
177
178
179
180
181
182
183
184
185 protected void loadLoggerHandlers(String loggerName, java.util.logging.Logger logger)
186 throws IOException {
187
188 Handler[] logHandlers = logger.getHandlers();
189 Set<String> currentHandlersNames = new HashSet<>() ;
190 for(Handler handler : logHandlers) {
191 currentHandlersNames.add(handler.getClass().getName()) ;
192 }
193
194 String handlers = loggingProperties.getProperty(loggerName +".handlersN");
195 if(handlers == null && "".equals(loggerName)) {
196 handlers = loggingProperties.getProperty("handlersN");
197 }
198 if (handlers != null) {
199 StringTokenizer tok = new StringTokenizer(handlers, ",");
200 while (tok.hasMoreTokens()) {
201 String handlerName = (tok.nextToken().trim());
202 String handlerClassName = handlerName;
203 String prefix = "";
204 if (handlerClassName.length() <= 0) {
205 continue;
206 }
207
208
209 if (Character.isDigit(handlerClassName.charAt(0))) {
210 int pos = handlerClassName.indexOf('.');
211 if (pos >= 0) {
212 prefix = handlerClassName.substring(0, pos + 1);
213 handlerClassName = handlerClassName.substring(pos + 1);
214 }
215 }
216 if(currentHandlersNames.contains(handlerClassName)) {
217 continue ;
218 }
219 try {
220 ClassLoader classLoader = this.getClass().getClassLoader() ;
221 Handler handler =
222 (Handler) classLoader.loadClass(handlerClassName).newInstance();
223
224
225
226 configureHandler(handlerName, handler);
227
228 logger.addHandler(handler);
229 } catch (Exception e) {
230
231 System.err.println("Handler error");
232 e.printStackTrace();
233 }
234 }
235
236 }
237
238 setLevelOnExistingLogger(loggerName, logger) ;
239
240 }
241
242
243
244
245
246
247
248
249 protected void configureHandler(String handlerName, Handler handler) {
250 Level level = getLevelProperty(handlerName + ".level", null);
251 if (level == null) {
252 level = getLevelProperty(".level", Level.OFF);
253 } handler.setLevel(level);
254 Filter filter = getFilterProperty(handlerName + ".filter", null);
255 if (filter == null) {
256 filter = getFilterProperty(".filter", null);
257 }
258 if (filter != null) {
259 handler.setFilter(filter);
260 }
261 java.util.logging.Formatter formatter = getFormatterProperty(handlerName + ".formatter", new SimpleFormatter());
262 handler.setFormatter(formatter);
263 }
264
265
266
267
268
269
270
271
272
273 protected String replace(String str, Properties props) {
274 String result = str;
275 int pos_start = result.indexOf("${");
276 if (pos_start != -1) {
277 int pos_end = result.indexOf('}');
278 if (pos_end != -1) {
279 String propName = result.substring(pos_start + 2, pos_end);
280 String replacement = props.getProperty(propName);
281 if (replacement != null) {
282 if (pos_start > 0) {
283 result = result.substring(0, pos_start) +
284 replacement + replace(result.substring(pos_end + 1), props);
285 } else {
286 result = replacement + replace(result.substring(pos_end + 1), props);
287 }
288 }
289 }
290 }
291 return result;
292 }
293
294
295
296
297
298
299
300
301
302
303
304
305 String checkForFile(String filePattern) throws IOException {
306
307 Properties bootstrapSystemProperties = BootstrapResourceUtils.getBootstrapSystemProperties();
308 if (filePattern.contains("%W")) {
309 String logdir = bootstrapSystemProperties.getProperty("org.lsst.ccs.workdir","%h") ;
310 filePattern = filePattern.replace("%W", logdir);
311 }
312 if (filePattern.contains("%L")) {
313 String logdir = bootstrapSystemProperties.getProperty("org.lsst.ccs.logdir","%h") ;
314 filePattern = filePattern.replace("%L", logdir);
315 }
316 if (filePattern.contains("%A")) {
317 String applicationName = bootstrapSystemProperties.getProperty("org.lsst.ccs.application.name","%u") ;
318 filePattern = filePattern.replace("%A", applicationName);
319 }
320
321 int lastSlash = filePattern.lastIndexOf('/');
322 if (lastSlash >= 0) {
323 String directorySpec = filePattern.substring(0, lastSlash);
324
325 if (directorySpec.contains("%h")) {
326 directorySpec = directorySpec.replace("%h", System.getProperty("user.home"));
327 } else if (directorySpec.contains("%t")) {
328 directorySpec = directorySpec.replace("%t", System.getProperty("java.io.tmpdir"));
329 }
330 Files.createDirectories(FileSystems.getDefault().getPath(directorySpec));
331 }
332 return filePattern ;
333 }
334
335
336 public static String loaderGetProperty(String name) {
337 getSystemLoaderLogManager();
338 try {
339 String res = systemLoaderLogManager.getProperty(name) ;
340 return res;
341 } catch (Exception e) {
342 System.err.println(" loaderGetProperty :" + e);
343 return null;
344 }
345
346 }
347 public static String loaderGetStringProperty(String name, String defaultValue) {
348 String val = loaderGetProperty(name);
349 if (val == null) {
350 return defaultValue;
351 }
352 return val.trim();
353 }
354 public static int loaderGetIntProperty(String name, int defaultValue) {
355
356 String val = loaderGetProperty(name);
357 if (val == null) {
358 return defaultValue;
359 }
360 try {
361 return Integer.parseInt(val.trim());
362 } catch (Exception ex) {
363 return defaultValue;
364 }
365 }
366
367
368 public static Level loaderGetLevelProperty(String name, Level defaultValue) {
369 String val = loaderGetProperty(name);
370 if (val == null) {
371 return defaultValue;
372 }
373 try {
374 return Level.parse(val.trim());
375 } catch (Exception ex) {
376 return defaultValue;
377 }
378
379 }
380
381
382
383
384
385
386 public static Formatter loaderGetFormatterProperty(String name, Formatter defaultValue) {
387
388 String val = loaderGetProperty(name);
389 try {
390 if (val != null) {
391
392 Class clazz = LogPropertiesLoader.class.getClassLoader().loadClass(val) ;
393 return (Formatter) clazz.newInstance();
394 }
395 } catch (Exception ex) {
396
397
398
399 }
400
401 return defaultValue;
402 }
403
404
405
406
407
408
409 synchronized private void setLevelOnExistingLogger(String loggerName, java.util.logging.Logger logger) {
410 Level level = getLevelProperty(loggerName + ".level", null) ;
411
412 if ( level != null ) {
413 logger.setLevel(level);
414 }
415 }
416
417 public String getProperty(String property) {
418 return systemLoaderLogManager.getProperty(property) ;
419 }
420
421
422
423
424
425 public String getStringProperty(String name, String defaultValue) {
426 String val = getProperty(name);
427 if (val == null) {
428 return defaultValue;
429 }
430 return val.trim();
431 }
432
433
434
435
436 public int getIntProperty(String name, int defaultValue) {
437 String val = getProperty(name);
438 if (val == null) {
439 return defaultValue;
440 }
441 try {
442 return Integer.parseInt(val.trim());
443 } catch (Exception ex) {
444 return defaultValue;
445 }
446 }
447
448
449
450
451 public boolean getBooleanProperty(String name, boolean defaultValue) {
452 String val = getProperty(name);
453 if (val == null) {
454 return defaultValue;
455 }
456 val = val.toLowerCase();
457 if (val.equals("true") || val.equals("1")) {
458 return true;
459 } else if (val.equals("false") || val.equals("0")) {
460 return false;
461 }
462 return defaultValue;
463 }
464
465
466 public Level getLevelProperty(String name, Level defaultValue) {
467 String val = getProperty(name);
468 if (val == null) {
469 return defaultValue;
470 }
471 try {
472 return Level.parse(val.trim());
473 } catch (Exception ex) {
474 return defaultValue;
475 }
476 }
477
478
479
480
481
482
483 public Filter getFilterProperty(String name, Filter defaultValue) {
484 String val = getProperty(name);
485 try {
486 if (val != null) {
487 Class clz = ClassLoader.getSystemClassLoader().loadClass(val);
488 return (Filter) clz.newInstance();
489 }
490 } catch (Exception ex) {
491
492
493
494 }
495
496 return defaultValue;
497 }
498
499
500
501
502
503
504 public Formatter getFormatterProperty(String name, Formatter defaultValue) {
505 String val = getProperty(name);
506 try {
507 if (val != null) {
508 Class clz = ClassLoader.getSystemClassLoader().loadClass(val);
509 return (Formatter) clz.newInstance();
510 }
511 } catch (Exception ex) {
512
513
514
515 }
516
517 return defaultValue;
518 }
519
520
521
522 }
523
524
525
526
527