]> git.argeo.org Git - lgpl/argeo-commons.git/blob - ThinLoggerFinder.java
47cb14655e45e78b4813159577273ca36232b10a
[lgpl/argeo-commons.git] / ThinLoggerFinder.java
1 package org.argeo.init.logging;
2
3 import java.io.Serializable;
4 import java.lang.System.Logger;
5 import java.lang.System.LoggerFinder;
6 import java.util.HashMap;
7 import java.util.Map;
8 import java.util.Objects;
9 import java.util.concurrent.Flow;
10 import java.util.function.Consumer;
11
12 /**
13 * Factory for Java system logging. As it has to be a public class in order to
14 * be exposed as a service provider, it is also the main entry point for the
15 * thin logging system, via static methos.
16 */
17 public class ThinLoggerFinder extends LoggerFinder {
18 private static ThinLogging logging;
19 private static ThinJavaUtilLogging javaUtilLogging;
20
21 public ThinLoggerFinder() {
22 if (logging != null)
23 throw new IllegalStateException("Only one logging can be initialised.");
24 // init();
25 }
26
27 @Override
28 public Logger getLogger(String name, Module module) {
29 lazyInit();
30 return logging.getLogger(name, module);
31 }
32
33 private static void init() {
34 logging = new ThinLogging();
35
36 Map<String, Object> configuration = new HashMap<>();
37 for (Object key : System.getProperties().keySet()) {
38 Objects.requireNonNull(key);
39 String property = key.toString();
40 if (property.startsWith(ThinLogging.LEVEL_PROPERTY_PREFIX)
41 || property.equals(ThinLogging.DEFAULT_LEVEL_PROPERTY))
42 configuration.put(property, System.getProperty(property));
43 }
44 logging.accept(configuration);
45 }
46
47 /**
48 * Falls back to java.util.logging if thin logging was not already initialised
49 * by the {@link LoggerFinder} mechanism.
50 */
51 public static void lazyInit() {
52 if (logging != null)
53 return;
54 if (javaUtilLogging != null)
55 return;
56 init();
57 javaUtilLogging = ThinJavaUtilLogging.init();
58 javaUtilLogging.readConfiguration(logging.getLevels());
59 }
60
61 public static Consumer<Map<String, Object>> getConfigurationConsumer() {
62 Objects.requireNonNull(logging);
63 return logging;
64 }
65
66 public static Flow.Publisher<Map<String, Serializable>> getLogEntryPublisher() {
67 Objects.requireNonNull(logging);
68 return logging.getLogEntryPublisher();
69 }
70
71 static void update(Map<String, Object> configuration) {
72 if (logging == null)
73 throw new IllegalStateException("Thin logging must be initialized first");
74 logging.accept(configuration);
75 if (javaUtilLogging != null)
76 javaUtilLogging.readConfiguration(logging.getLevels());
77 }
78
79 static Logger getLogger(String name) {
80 return logging.getLogger(name, null);
81 }
82 }