]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.init/src/org/argeo/init/logging/ThinLoggerFinder.java
APIs javadoc
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / logging / 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 return logging.getLogger(name, module);
30 }
31
32 private static void init() {
33 logging = new ThinLogging();
34
35 Map<String, Object> configuration = new HashMap<>();
36 for (Object key : System.getProperties().keySet()) {
37 Objects.requireNonNull(key);
38 String property = key.toString();
39 if (property.startsWith(ThinLogging.LEVEL_PROPERTY_PREFIX)
40 || property.equals(ThinLogging.DEFAULT_LEVEL_PROPERTY))
41 configuration.put(property, System.getProperty(property));
42 }
43 logging.accept(configuration);
44 }
45
46 /**
47 * Falls back to java.util.logging if thin logging was not already initialised
48 * by the {@link LoggerFinder} mechanism.
49 */
50 public static void lazyInit() {
51 if (logging != null)
52 return;
53 if (javaUtilLogging != null)
54 return;
55 init();
56 javaUtilLogging = ThinJavaUtilLogging.init();
57 javaUtilLogging.readConfiguration(logging.getLevels());
58 }
59
60 public static Consumer<Map<String, Object>> getConfigurationConsumer() {
61 Objects.requireNonNull(logging);
62 return logging;
63 }
64
65 public static Flow.Publisher<Map<String, Serializable>> getLogEntryPublisher() {
66 Objects.requireNonNull(logging);
67 return logging.getLogEntryPublisher();
68 }
69
70 static void update(Map<String, Object> configuration) {
71 if (logging == null)
72 throw new IllegalStateException("Thin logging must be initialized first");
73 logging.accept(configuration);
74 if (javaUtilLogging != null)
75 javaUtilLogging.readConfiguration(logging.getLevels());
76 }
77
78 static Logger getLogger(String name) {
79 return logging.getLogger(name, null);
80 }
81 }