diff --git a/core/src/main/java/io/jstach/rainbowgum/LogAppender.java b/core/src/main/java/io/jstach/rainbowgum/LogAppender.java index 8c693810..fd1d172c 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogAppender.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogAppender.java @@ -1,6 +1,5 @@ package io.jstach.rainbowgum; -import java.net.URI; import java.util.List; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Function; @@ -20,6 +19,26 @@ */ public interface LogAppender extends LogLifecycle, LogEventConsumer { + /** + * Default Console appender name. + */ + static final String CONSOLE_APPENDER_NAME = "console"; + + /** + * Default output file appender name. + */ + static final String FILE_APPENDER_NAME = "file"; + + /** + * Output appender property. + */ + static final String APPENDER_OUTPUT_PROPERTY = LogProperties.APPENDER_PREFIX + "output"; + + /** + * Encoder appender property. + */ + static final String APPENDER_ENCODER_PROPERTY = LogProperties.APPENDER_PREFIX + "encoder"; + /** * Batch of events. DO NOT MODIFY THE ARRAY. Do not use the * length of the passed in array but instead use count @@ -93,9 +112,19 @@ public static final class Builder { protected @Nullable LogEncoder encoder; + // private final String name; + private Builder() { } + //// /** + //// * Name of the appender. + //// * @return name. + //// */ + //// public String name() { + //// return this.name; + // } + /** * Sets output. If not set defaults to {@link LogOutput#ofStandardOut()}. * @param output output. @@ -340,8 +369,6 @@ class DefaultLogAppender extends AbstractLogAppender implements ThreadSafeLogApp return new LockingLogAppender(appender); }; - static final Property fileProperty = Property.builder().map(URI::new).build(LogProperties.FILE_PROPERTY); - protected final ReentrantLock lock = new ReentrantLock(); public DefaultLogAppender(LogOutput output, LogEncoder encoder) { diff --git a/core/src/main/java/io/jstach/rainbowgum/LogAppenderRegistry.java b/core/src/main/java/io/jstach/rainbowgum/LogAppenderRegistry.java new file mode 100644 index 00000000..e25e9766 --- /dev/null +++ b/core/src/main/java/io/jstach/rainbowgum/LogAppenderRegistry.java @@ -0,0 +1,142 @@ +package io.jstach.rainbowgum; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.jdt.annotation.Nullable; + +import io.jstach.rainbowgum.LogAppender.AppenderProvider; +import io.jstach.rainbowgum.LogProperties.Property; + +/** + * Register appenders by name. + */ +public sealed interface LogAppenderRegistry permits DefaultAppenderRegistry { + + /** + * Finds an appender by name. + * @param name name of the appender. + * @return appender provider to be used for creating the appender. + */ + Optional appender(String name); + + /** + * Registers an appender provider by name. + * @param name of the appender. + * @param appenderProvider factory to be used for creating appenders. + */ + void register(String name, AppenderProvider appenderProvider); + + /** + * Creates a log appender registry. + * @return appender registry. + */ + public static LogAppenderRegistry of() { + return new DefaultAppenderRegistry(); + } + +} + +final class DefaultAppenderRegistry implements LogAppenderRegistry { + + private final Map providers = new ConcurrentHashMap<>(); + + static final Property fileProperty = Property.builder().toURI().build(LogProperties.FILE_PROPERTY); + + static final Property> appendersProperty = Property.builder() + .map(LogProperties::parseList) + .orElse(List.of()) + .build(LogProperties.APPENDERS_PROPERTY); + + static List defaultAppenders(LogConfig config) { + List appenders = new ArrayList<>(); + fileAppender(config).ifPresent(appenders::add); + List appenderNames = appendersProperty.get(config.properties()).value(List.of()); + + for (String appenderName : appenderNames) { + var outputProperty = outputProperty(LogAppender.APPENDER_OUTPUT_PROPERTY, appenderName, config); + var encoderProperty = encoderProperty(LogAppender.APPENDER_ENCODER_PROPERTY, appenderName, config); + appenders.add(appender(appenderName, outputProperty, encoderProperty, config)); + } + if (appenders.isEmpty()) { + var consoleAppender = defaultConsoleAppender(config); + appenders.add(consoleAppender); + } + return appenders; + } + + private static LogAppender defaultConsoleAppender(LogConfig config) { + var consoleAppender = LogAppender.builder().output(LogOutput.ofStandardOut()).build().provide(config); + return consoleAppender; + } + + static Optional fileAppender(LogConfig config) { + String name = LogAppender.FILE_APPENDER_NAME; + var outputProperty = outputProperty(LogAppender.APPENDER_OUTPUT_PROPERTY, name, config); + var encoderProperty = encoderProperty(LogAppender.APPENDER_ENCODER_PROPERTY, name, config); + return fileProperty // + .map(u -> appender(name, outputProperty, encoderProperty, config)) + .get(config.properties()) + .optional(); + } + + static LogAppender appender( // + String name, Property outputProperty, Property encoderProperty, LogConfig config) { + var appenderRegistry = config.appenderRegistry(); + var appender = appenderRegistry.appender(name).map(a -> a.provide(config)).orElse(null); + if (appender != null) { + return appender; + } + var builder = LogAppender.builder(); + LogOutput output = outputProperty.get(config.properties()).valueOrNull(); + if (output != null) { + builder.output(output); + } + LogEncoder encoder = encoderProperty.get(config.properties()).valueOrNull(); + if (encoder != null) { + builder.encoder(encoder); + } + return builder.build().provide(config); + + } + + private static @Nullable LogOutput outputForAppender(String propertyName, String name, LogConfig config) { + LogOutput output = Property.builder() // + .toURI() // + .map(u -> config.outputRegistry().output(u, name, config.properties())) // + .buildWithName(propertyName, name) // + .get(config.properties()) // + .valueOrNull(); + return output; + } + + private static Property outputProperty(String propertyName, String name, LogConfig config) { + return Property.builder() // + .toURI() // + .map(u -> config.outputRegistry().output(u, name, config.properties())) // + .buildWithName(propertyName, name); + } + + private static Property encoderProperty(String propertyName, String name, LogConfig config) { + return Property.builder() // + .toURI() // + .map(u -> config.encoderRegistry().provide(u, name, config.properties())) // + .buildWithName(propertyName, name); + } + + @Override + public Optional appender(String name) { + return Optional.ofNullable(providers.get(name)); + } + + @Override + public void register(String name, AppenderProvider appenderProvider) { + providers.put(name, appenderProvider); + + } + +} diff --git a/core/src/main/java/io/jstach/rainbowgum/LogConfig.java b/core/src/main/java/io/jstach/rainbowgum/LogConfig.java index 902a7c45..a09ba1d4 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogConfig.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogConfig.java @@ -10,9 +10,7 @@ import io.jstach.rainbowgum.LevelResolver.LevelConfig; import io.jstach.rainbowgum.LogConfig.ChangePublisher; -import io.jstach.rainbowgum.LogProperties.Property; import io.jstach.rainbowgum.LogProperties.PropertyGetter; -import io.jstach.rainbowgum.LogProperties.PropertyValue; /** * The configuration of a RainbowGum. In some other logging implementations this is called @@ -26,16 +24,6 @@ public sealed interface LogConfig { */ public LogProperties properties(); - /** - * Gets a property value from the properties. - * @param property type - * @param property property to look up. - * @return property value nevern null. - */ - default PropertyValue get(Property property) { - return properties().property(property); - } - /** * Level resolver for resolving levels from logger names. * @return level resolver. @@ -54,6 +42,18 @@ default PropertyValue get(Property property) { */ public LogOutputRegistry outputRegistry(); + /** + * Provides appenders by name. + * @return appender registry. + */ + public LogAppenderRegistry appenderRegistry(); + + /** + * Provides encoders by name. + * @return encoder registry. + */ + public LogEncoderRegistry encoderRegistry(); + /** * Finds an output from a URI. * @param uri uri. @@ -102,7 +102,7 @@ public static Builder builder() { * initialization process. * @return registry. */ - public ServiceRegistry registry(); + public ServiceRegistry serviceRegistry(); /** * Config Change Publisher. @@ -230,6 +230,10 @@ final class DefaultLogConfig implements LogConfig { private final LogFormatterRegistry formatterRegistry; + private final LogAppenderRegistry appenderRegistry; + + private final LogEncoderRegistry encoderRegistry; + public DefaultLogConfig(ServiceRegistry registry, LogProperties properties) { super(); this.registry = registry; @@ -243,6 +247,8 @@ protected LogConfig _config() { }; this.outputRegistry = LogOutputRegistry.of(); this.formatterRegistry = LogFormatterRegistry.of(); + this.appenderRegistry = LogAppenderRegistry.of(); + this.encoderRegistry = LogEncoderRegistry.of(); } @Override @@ -256,7 +262,7 @@ public LevelConfig levelResolver() { } @Override - public ServiceRegistry registry() { + public ServiceRegistry serviceRegistry() { return this.registry; } @@ -275,4 +281,14 @@ public LogFormatterRegistry formatterRegistry() { return this.formatterRegistry; } + @Override + public LogAppenderRegistry appenderRegistry() { + return this.appenderRegistry; + } + + @Override + public LogEncoderRegistry encoderRegistry() { + return this.encoderRegistry; + } + } diff --git a/core/src/main/java/io/jstach/rainbowgum/LogEncoder.java b/core/src/main/java/io/jstach/rainbowgum/LogEncoder.java index 2d7ea155..cac7bd16 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogEncoder.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogEncoder.java @@ -1,5 +1,7 @@ package io.jstach.rainbowgum; +import java.io.IOException; +import java.net.URI; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -68,6 +70,23 @@ public static LogEncoder of(LogFormatter formatter) { return new FormatterEncoder(formatter); } + /** + * Finds output based on URI. + */ + public interface EncoderProvider { + + /** + * Loads an encoder from a URI. + * @param uri uri. + * @param name name of encoder. + * @param properties key value config. + * @return output. + * @see LogProperties#of(URI) + */ + LogEncoder provide(URI uri, String name, LogProperties properties); + + } + /** * Encoders buffer. */ diff --git a/core/src/main/java/io/jstach/rainbowgum/LogEncoderRegistry.java b/core/src/main/java/io/jstach/rainbowgum/LogEncoderRegistry.java new file mode 100644 index 00000000..e7cfe05d --- /dev/null +++ b/core/src/main/java/io/jstach/rainbowgum/LogEncoderRegistry.java @@ -0,0 +1,97 @@ +package io.jstach.rainbowgum; + +import java.net.URI; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import io.jstach.rainbowgum.LogEncoder.EncoderProvider; + +/** + * Encoder registry + */ +public sealed interface LogEncoderRegistry extends EncoderProvider { + + /** + * Finds an encoder by name. + * @param name encoder name. + * @return encoder + */ + public Optional encoder(String name); + + /** + * Registers an encoder by name. + * @param name encoder name. + * @param encoder loaded encoder + */ + public void register(String name, LogEncoder encoder); + + /** + * Registers an encoder by name. + * @param name encoder name. + * @param encoder loaded encoder + */ + public void register(String name, EncoderProvider encoder); + + /** + * Creates encoder registry + * @return encoder registry + */ + public static LogEncoderRegistry of() { + return new DefaultEncoderRegistry(); + } + +} + +final class DefaultEncoderRegistry implements LogEncoderRegistry { + + private Map encoders = new ConcurrentHashMap<>(); + + private Map providers = new ConcurrentHashMap<>(); + + @Override + public Optional encoder(String name) { + return Optional.ofNullable(encoders.get(name)); + } + + @Override + public void register(String name, LogEncoder encoder) { + encoders.put(name, encoder); + } + + @Override + public LogEncoder provide(URI uri, String name, LogProperties properties) { + String scheme = uri.getScheme(); + String path = uri.getPath(); + + if (scheme == null && path != null) { + return _encoder(uri, name, path); + } + else if (scheme.equals("encoder") || scheme.equals("name")) { + String _name = uri.getHost(); + if (_name == null) { + _name = name; + } + return _encoder(uri, name, _name); + + } + var provider = providers.get(scheme); + if (provider == null) { + throw new NoSuchElementException("No encoder found. URI=" + uri); + } + return provider.provide(uri, name, properties); + } + + private LogEncoder _encoder(URI uri, String name, String resolvedName) { + return encoder(resolvedName).orElseThrow(() -> new NoSuchElementException( + "No encoder found. resolved = " + resolvedName + " name= " + name + ", uri=" + uri)); + } + + @Override + public void register(String name, EncoderProvider encoder) { + providers.put(name, encoder); + + } + +} diff --git a/core/src/main/java/io/jstach/rainbowgum/LogOutput.java b/core/src/main/java/io/jstach/rainbowgum/LogOutput.java index e748d78f..ff13539f 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogOutput.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogOutput.java @@ -28,7 +28,7 @@ * The write methods do not throw {@link IOException} on purpose as it is implementations * responsibility to handle errors and to be resilient on their own. * - * @see LogOutputProvider + * @see LogOutput.OutputProvider * @see Buffer */ public interface LogOutput extends LogLifecycle, Flushable { @@ -70,6 +70,24 @@ private static URI uri(String s) { } } + /** + * Finds output based on URI. + */ + public interface OutputProvider { + + /** + * Loads an output from a URI. + * @param uri uri. + * @param name name of output. + * @param properties key value config. + * @return output. + * @throws IOException if unable to use the URI. + * @see LogProperties#of(URI) + */ + LogOutput output(URI uri, String name, LogProperties properties) throws IOException; + + } + /** * The content type of the binary data passed to the output from an encoder. */ diff --git a/core/src/main/java/io/jstach/rainbowgum/LogOutputProvider.java b/core/src/main/java/io/jstach/rainbowgum/LogOutputProvider.java deleted file mode 100644 index 7af8ec25..00000000 --- a/core/src/main/java/io/jstach/rainbowgum/LogOutputProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.jstach.rainbowgum; - -import java.io.IOException; -import java.net.URI; - -/** - * Finds output based on URI. - */ -public interface LogOutputProvider { - - /** - * Loads an output from a URI. - * @param uri uri. - * @param name name of output. - * @param properties key value config. - * @return output. - * @throws IOException if unable to use the URI. - * @see LogProperties#of(URI) - */ - LogOutput output(URI uri, String name, LogProperties properties) throws IOException; - -} diff --git a/core/src/main/java/io/jstach/rainbowgum/LogOutputRegistry.java b/core/src/main/java/io/jstach/rainbowgum/LogOutputRegistry.java index 016692cf..ad79004a 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogOutputRegistry.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogOutputRegistry.java @@ -6,24 +6,42 @@ import java.nio.channels.FileChannel; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; -import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Stream; -import io.jstach.rainbowgum.LogProperties.Property; +import io.jstach.rainbowgum.LogOutput.OutputProvider; /** * Register output providers by URI scheme. */ -public sealed interface LogOutputRegistry extends LogOutputProvider permits DefaultOutputRegistry { +public sealed interface LogOutputRegistry extends OutputProvider permits DefaultOutputRegistry { + + /** + * A meta URI scheme to reference outputs registered somewhere else. + */ + public static String NAMED_OUTPUT_SCHEME = "output"; /** * Register a provider by {@link URI#getScheme() scheme}. * @param scheme URI scheme to match for. * @param provider provider for scheme. */ - public void put(String scheme, LogOutputProvider provider); + public void register(String scheme, OutputProvider provider); + + /** + * Finds an output by name. + * @param name output name. + * @return maybe an output. + */ + Optional output(String name); + + /** + * Register a provider by {@link URI#getScheme() scheme}. + * @param name URI scheme to match for. + * @param output for name. + */ + public void register(String name, LogOutput output); /** * Default output provider. @@ -37,27 +55,43 @@ public static LogOutputRegistry of() { final class DefaultOutputRegistry implements LogOutputRegistry { - static final Property> outputProperty = Property.builder() - .map(p -> Stream.of(p.split(",")).filter(s -> !s.trim().isEmpty()).toList()) - .build(LogProperties.OUTPUT_PROPERTY); + private final Map providers = new ConcurrentHashMap<>(); - private final Map providers = new ConcurrentHashMap<>(); + private final Map outputs = new ConcurrentHashMap<>(); @Override - public void put(String scheme, LogOutputProvider provider) { + public void register(String scheme, OutputProvider provider) { providers.put(scheme, provider); } + @Override + public void register(String name, LogOutput output) { + outputs.put(name, output); + } + + @Override + public Optional output(String name) { + return Optional.ofNullable(outputs.get(name)); + } + @Override public LogOutput output(URI uri, String name, LogProperties properties) throws IOException { String scheme = uri.getScheme(); String path = uri.getPath(); - LogOutputProvider customProvider; + OutputProvider customProvider; if (scheme == null && path != null) { @SuppressWarnings("resource") FileOutputStream fos = new FileOutputStream(path); return LogOutput.of(uri, fos.getChannel()); } + else if (NAMED_OUTPUT_SCHEME.equals(scheme)) { + String host = uri.getHost(); + if (host != null) { + name = host; + } + String _name = name; + return output(name).orElseThrow(() -> new IOException("Output for name: " + _name + " not found.")); + } else if (LogOutput.STDOUT_SCHEME.equals(scheme)) { return LogOutput.ofStandardOut(); } diff --git a/core/src/main/java/io/jstach/rainbowgum/LogProperties.java b/core/src/main/java/io/jstach/rainbowgum/LogProperties.java index 8b7f8a91..77f71df3 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogProperties.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogProperties.java @@ -57,7 +57,7 @@ * A URI or file path to log to a file. * * - * {@value #OUTPUT_PROPERTY} = URI + * {@value #APPENDERS_PROPERTY} = List<String> * A URI to an {@linkplain LogOutput output}. * * @@ -90,38 +90,44 @@ public interface LogProperties { */ static final String FILE_PROPERTY = ROOT_PREFIX + "file.name"; + // /** + // * Logging output property for appending to a resource. The value should be a list + // of + // * names. + // */ + // static final String OUTPUT_PROPERTY = ROOT_PREFIX + "output"; + /** - * Logging output property for appending to a resource. The value should be a list of - * names. + * A common prefix parameter is called name. */ - static final String OUTPUT_PROPERTY = ROOT_PREFIX + "output"; + static final String NAME = "name"; /** * Logging output prefix for configuration. */ - static final String OUTPUT_PREFIX = ROOT_PREFIX + "output.{name}."; + static final String OUTPUT_PREFIX = ROOT_PREFIX + "output.{" + NAME + "}."; /** * Logging output prefix for configuration. */ - static final String ENCODER_PREFIX = ROOT_PREFIX + "encoder.{name}."; + static final String ENCODER_PREFIX = ROOT_PREFIX + "encoder.{" + NAME + "}."; /** - * Analogous to {@link System#getProperty(String)}. - * @param key property key. - * @return property value. + * Logging appenders. The value should be a list of names. */ - public @Nullable String valueOrNull(String key); + static final String APPENDERS_PROPERTY = ROOT_PREFIX + "appenders"; /** - * Gets a value based on the passed in property. - * @param value type. - * @param property property. + * Logging appender prefix for configuration. + */ + static final String APPENDER_PREFIX = ROOT_PREFIX + "appender.{" + NAME + "}."; + + /** + * Analogous to {@link System#getProperty(String)}. + * @param key property key. * @return property value. */ - default PropertyValue property(Property property) { - return property.get(this); - } + public @Nullable String valueOrNull(String key); /** * Searches up a path using this properties to check for values. @@ -233,14 +239,24 @@ public static Map parseMap(String query) { } /** - * Parses a URI query for a multi value map. + * Parses a URI query for a multi value map. The list values of the map maybe empty if + * the query parameter does not have any values associated with it which would be the + * case if there is a parameter (key) with no "=" following it. For + * example the following would have three entries of a,b,c all with empty + * list:
+	 * 
+	 * a&b&c&
+	 *  
* @param query raw query component of URI. * @return decoded key values with multiple keys grouped together in order found. */ public static Map> parseMultiMap(String query) { Map> m = new LinkedHashMap<>(); BiConsumer f = (k, v) -> { - m.computeIfAbsent(k, _k -> new ArrayList()).add(v); + var list = m.computeIfAbsent(k, _k -> new ArrayList()); + if (v != null) { + list.add(v); + } }; parseUriQuery(query, true, f); return m; @@ -665,6 +681,18 @@ default Property build(String key) { return new Property<>(this, key); } + /** + * Creates a Property from the given key and its {@value LogProperties#NAME} + * parameter. + * @param key key. + * @param name interpolates {name} in property name with this value. + * @return property. + */ + default Property buildWithName(String key, String name) { + String fqn = LogProperties.interpolateKey(name, Map.of(NAME, name)); + return build(fqn); + } + /** * Find root property getter. * @param e property getter. diff --git a/core/src/main/java/io/jstach/rainbowgum/LogRouter.java b/core/src/main/java/io/jstach/rainbowgum/LogRouter.java index ea97d5d6..ef86861e 100644 --- a/core/src/main/java/io/jstach/rainbowgum/LogRouter.java +++ b/core/src/main/java/io/jstach/rainbowgum/LogRouter.java @@ -239,23 +239,10 @@ Router build() { var publisher = this.publisher; List appenders = new ArrayList<>(this.appenders); if (appenders.isEmpty()) { - appenders.add(LogAppender.builder().output(LogOutput.ofStandardOut()).build()); - config.get(DefaultLogAppender.fileProperty) // - .map(u -> config.output(u, "")) // - .map(o -> { - return LogAppender.builder().output(o).build(); - }) // - .optional() // - .ifPresent(appenders::add); - - List outputs = config.get(DefaultOutputRegistry.outputProperty).value(List.of()); - for (String o : outputs) { - Property outputProperty = output(DefaultOutputRegistry.outputProperty, o); - LogOutput output = outputProperty.map(u -> config.output(u, o)) - .get(config.properties()) - .value(); - appenders.add(LogAppender.builder().output(output).build()); - } + DefaultAppenderRegistry.defaultAppenders(config) // + .stream() // + .map(a -> (c -> a)) // + .forEach(appenders::add); } if (publisher == null) { publisher = LogPublisher.SyncLogPublisher // @@ -271,11 +258,6 @@ Router build() { } - private static Property output(Property property, String name) { - String newKey = LogProperties.concatKey(property.key(), name); - return Property.builder().toURI().build(newKey); - } - } } diff --git a/core/src/main/java/io/jstach/rainbowgum/RainbowGum.java b/core/src/main/java/io/jstach/rainbowgum/RainbowGum.java index 690fdedc..d0e136bf 100644 --- a/core/src/main/java/io/jstach/rainbowgum/RainbowGum.java +++ b/core/src/main/java/io/jstach/rainbowgum/RainbowGum.java @@ -9,6 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; +import io.jstach.rainbowgum.LogPublisher.PublisherProvider; import io.jstach.rainbowgum.LogRouter.RootRouter; import io.jstach.rainbowgum.LogRouter.Router; import io.jstach.rainbowgum.spi.RainbowGumServiceProvider; @@ -45,9 +46,9 @@ public Optional provide(LogConfig config) { var gum = RainbowGum.builder() // .route(r -> { - r.publisher(PublisherProvider.async().bufferSize(config.get(bufferSize).value()).build()); + r.publisher(PublisherProvider.async().bufferSize(bufferSize.get(config.properties()).value()).build()); r.appender(a -> { - a.output(config.get(output).value()); + a.output(output.get(config.properties()).value()); }); r.level(Level.INFO); }) diff --git a/core/src/main/java/io/jstach/rainbowgum/spi/RainbowGumServiceProvider.java b/core/src/main/java/io/jstach/rainbowgum/spi/RainbowGumServiceProvider.java index cdc410fa..4fa24905 100644 --- a/core/src/main/java/io/jstach/rainbowgum/spi/RainbowGumServiceProvider.java +++ b/core/src/main/java/io/jstach/rainbowgum/spi/RainbowGumServiceProvider.java @@ -8,7 +8,6 @@ import org.eclipse.jdt.annotation.Nullable; import io.jstach.rainbowgum.LogConfig; -import io.jstach.rainbowgum.LogOutputProvider; import io.jstach.rainbowgum.LogProperties; import io.jstach.rainbowgum.RainbowGum; import io.jstach.rainbowgum.ServiceRegistry; @@ -49,7 +48,7 @@ public non-sealed interface ConfigProvider extends RainbowGumServiceProvider { /** * Called after {@link LogConfig} has been loaded to do various custom initialization - * like registering {@link LogOutputProvider}s. + * like registering {@link io.jstach.rainbowgum.LogOutput.OutputProvider}s. * * @see LogConfig#outputRegistry() */ @@ -122,7 +121,7 @@ private static LogConfig provideConfig(ServiceLoader * @param config config before initializers have run. */ public static void runInitializers(ServiceLoader loader, LogConfig config) { - findProviders(loader, Initializer.class).forEach(c -> c.initialize(config.registry(), config)); + findProviders(loader, Initializer.class).forEach(c -> c.initialize(config.serviceRegistry(), config)); } /** diff --git a/core/src/test/java/io/jstach/rainbowgum/LogPropertiesTest.java b/core/src/test/java/io/jstach/rainbowgum/LogPropertiesTest.java index a93a8ac9..041e86de 100644 --- a/core/src/test/java/io/jstach/rainbowgum/LogPropertiesTest.java +++ b/core/src/test/java/io/jstach/rainbowgum/LogPropertiesTest.java @@ -16,7 +16,7 @@ void testValue() { var extractor = ConfigLevelResolver.levelExtractor; var property = extractor.property("com.stuff"); // assertEquals(Level.ALL, property.require(props)); - PropertyValue value = props.property(property); + PropertyValue value = property.get(props); value.value(); } diff --git a/rainbowgum-rabbitmq/src/main/java/io/jstach/rainbowgum/rabbitmq/RabbitMQInitializer.java b/rainbowgum-rabbitmq/src/main/java/io/jstach/rainbowgum/rabbitmq/RabbitMQInitializer.java index d10626b6..3efaed39 100644 --- a/rainbowgum-rabbitmq/src/main/java/io/jstach/rainbowgum/rabbitmq/RabbitMQInitializer.java +++ b/rainbowgum-rabbitmq/src/main/java/io/jstach/rainbowgum/rabbitmq/RabbitMQInitializer.java @@ -5,7 +5,7 @@ import io.jstach.rainbowgum.LogConfig; import io.jstach.rainbowgum.LogOutput; -import io.jstach.rainbowgum.LogOutputProvider; +import io.jstach.rainbowgum.LogOutput.OutputProvider; import io.jstach.rainbowgum.LogProperties; import io.jstach.rainbowgum.ServiceRegistry; import io.jstach.rainbowgum.spi.RainbowGumServiceProvider; @@ -27,10 +27,10 @@ public RabbitMQInitializer() { @Override public void initialize(ServiceRegistry registry, LogConfig config) { - config.outputRegistry().put(SCHEME, RabbitMQOutputProvider.INSTANCE); + config.outputRegistry().register(SCHEME, RabbitMQOutputProvider.INSTANCE); } - private enum RabbitMQOutputProvider implements LogOutputProvider { + private enum RabbitMQOutputProvider implements OutputProvider { INSTANCE; diff --git a/rainbowgum/src/test/java/snippets/RainbowGumProviderExample.java b/rainbowgum/src/test/java/snippets/RainbowGumProviderExample.java index b106bb89..de119525 100644 --- a/rainbowgum/src/test/java/snippets/RainbowGumProviderExample.java +++ b/rainbowgum/src/test/java/snippets/RainbowGumProviderExample.java @@ -30,9 +30,9 @@ public Optional provide(LogConfig config) { var gum = RainbowGum.builder() // .route(r -> { - r.publisher(PublisherProvider.async().bufferSize(config.get(bufferSize).value()).build()); + r.publisher(PublisherProvider.async().bufferSize(bufferSize.get(config.properties()).value()).build()); r.appender(a -> { - a.output(config.get(output).value()); + a.output(output.get(config.properties()).value()); }); r.level(Level.INFO); }) diff --git a/test/rainbowgum-test-rabbitmq/src/main/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetup.java b/test/rainbowgum-test-rabbitmq/src/main/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetup.java index b7b1d7f4..b021a2fc 100644 --- a/test/rainbowgum-test-rabbitmq/src/main/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetup.java +++ b/test/rainbowgum-test-rabbitmq/src/main/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetup.java @@ -1,31 +1,28 @@ package io.jstach.rainbowgum.test.rabbitmq; import java.lang.System.Logger.Level; -import java.util.LinkedHashMap; import java.util.Map; import java.util.ServiceLoader; -import org.slf4j.LoggerFactory; - import io.jstach.rainbowgum.LogConfig; -import io.jstach.rainbowgum.LogProperties; import io.jstach.rainbowgum.RainbowGum; import io.jstach.rainbowgum.spi.RainbowGumServiceProvider; public class RabbitMQSetup { - public static void main(String[] args) { - - Map properties = new LinkedHashMap<>(); - properties.put(LogProperties.OUTPUT_PROPERTY, "amqp"); - properties.put(LogProperties.OUTPUT_PROPERTY + ".amqp", "amqp:///"); - var config = LogConfig.builder().logProperties(properties::get).build(); - RainbowGumServiceProvider.runInitializers(ServiceLoader.load(RainbowGumServiceProvider.class), config); - RainbowGum.set(() -> RainbowGum.builder(config).build()); - // RainbowGum.set(() -> gum); - var logger = LoggerFactory.getLogger(RabbitMQSetup.class); - logger.info("hello"); - } + // public static void main(String[] args) { + // + // Map properties = new LinkedHashMap<>(); + // properties.put(LogProperties.OUTPUT_PROPERTY, "amqp"); + // properties.put(LogProperties.OUTPUT_PROPERTY + ".amqp", "amqp:///"); + // var config = LogConfig.builder().logProperties(properties::get).build(); + // RainbowGumServiceProvider.runInitializers(ServiceLoader.load(RainbowGumServiceProvider.class), + // config); + // RainbowGum.set(() -> RainbowGum.builder(config).build()); + // // RainbowGum.set(() -> gum); + // var logger = LoggerFactory.getLogger(RabbitMQSetup.class); + // logger.info("hello"); + // } public static void run(Map properties) { var config = LogConfig.builder().logProperties(properties::get).build(); diff --git a/test/rainbowgum-test-rabbitmq/src/test/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetupTest.java b/test/rainbowgum-test-rabbitmq/src/test/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetupTest.java index acd7ce89..d016c050 100644 --- a/test/rainbowgum-test-rabbitmq/src/test/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetupTest.java +++ b/test/rainbowgum-test-rabbitmq/src/test/java/io/jstach/rainbowgum/test/rabbitmq/RabbitMQSetupTest.java @@ -35,8 +35,8 @@ void testMain() { b.uri(URI.create(rabbit.getAmqpUrl())); b.declareExchange(true); Map properties = new LinkedHashMap<>(); - properties.put(LogProperties.OUTPUT_PROPERTY, "amqp"); - properties.put(LogProperties.OUTPUT_PROPERTY + ".amqp", "amqp:///"); + properties.put(LogProperties.APPENDERS_PROPERTY, "amqp"); + properties.put(LogProperties.interpolateKey(LogProperties.APPENDER_PREFIX, Map.of("name", "amqp")), "amqp:///"); b.toProperties(properties::put); System.out.println(properties); System.out.println(rabbit.getAmqpUrl());