Skip to content

Commit

Permalink
Some cleanup of appender providers logging.file
Browse files Browse the repository at this point in the history
  • Loading branch information
agentgt committed Jan 12, 2024
1 parent a8e5c70 commit c934c3b
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 229 deletions.
45 changes: 16 additions & 29 deletions core/src/main/java/io/jstach/rainbowgum/LogAppender.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import io.jstach.rainbowgum.LogAppender.AbstractLogAppender;
import io.jstach.rainbowgum.LogAppender.ThreadSafeLogAppender;
import io.jstach.rainbowgum.LogConfig.Provider;
import io.jstach.rainbowgum.LogEncoder.Buffer;

/**
Expand All @@ -16,7 +17,7 @@
*
* The only exception is if an Appender implements {@link ThreadSafeLogAppender}.
*/
public interface LogAppender extends LogLifecycle, LogEventConsumer {
public interface LogAppender extends LogLifecycle, LogEventConsumer, LogConfig.Provider<LogAppender> {

/**
* Default Console appender name.
Expand Down Expand Up @@ -53,27 +54,9 @@ default void append(LogEvent[] events, int count) {

public void append(LogEvent event);

/**
* A factor of appenders.
*/
public interface AppenderProvider {

/**
* Creates an appender from config.
* @param config config.
* @return appender.
*/
LogAppender provide(LogConfig config);

/**
* Creates a builder to create an appender provider.
* @param name name of appender.
* @return builder.
*/
public static Builder builder(String name) {
return LogAppender.builder(name);
}

@Override
default LogAppender provide(LogConfig config) {
return this;
}

/**
Expand Down Expand Up @@ -109,9 +92,9 @@ public static LogAppender of(List<? extends LogAppender> appenders) {
*/
public static final class Builder {

protected @Nullable LogOutput output;
protected @Nullable Provider<LogOutput> output;

protected @Nullable LogEncoder encoder;
protected @Nullable Provider<LogEncoder> encoder;

private final String name;

Expand All @@ -128,11 +111,11 @@ public String name() {
}

/**
* Sets output. If not set defaults to {@link LogOutput#ofStandardOut()}.
* Sets output.
* @param output output.
* @return builder.
*/
public Builder output(LogOutput output) {
public Builder output(Provider<LogOutput> output) {
this.output = output;
return this;
}
Expand Down Expand Up @@ -164,7 +147,7 @@ public Builder formatter(LogFormatter.EventFormatter formatter) {
* @param encoder encoder not <code>null</code>.
* @return builder.
*/
public Builder encoder(LogEncoder encoder) {
public Builder encoder(Provider<LogEncoder> encoder) {
this.encoder = encoder;
return this;
}
Expand All @@ -173,12 +156,16 @@ public Builder encoder(LogEncoder encoder) {
* Builds.
* @return an appender factory.
*/
public AppenderProvider build() {
public Provider<LogAppender> build() {
/*
* We need to capture parameters since appender creation needs to be lazy.
*/
AppenderConfig a = new AppenderConfig(name, output, encoder);
var _name = name;
var _output = output;
var _encoder = encoder;
return config -> {
AppenderConfig a = new AppenderConfig(_name, Provider.provideOrNull(_output, config),
Provider.provideOrNull(_encoder, config));
return DefaultAppenderRegistry.appender(a, config);
};
}
Expand Down
22 changes: 12 additions & 10 deletions core/src/main/java/io/jstach/rainbowgum/LogAppenderRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import org.eclipse.jdt.annotation.Nullable;

import io.jstach.rainbowgum.LogAppender.AppenderProvider;
import io.jstach.rainbowgum.LogConfig.Provider;
import io.jstach.rainbowgum.LogProperties.Property;

/**
Expand All @@ -22,14 +22,14 @@ public sealed interface LogAppenderRegistry permits DefaultAppenderRegistry {
* @param name name of the appender.
* @return appender provider to be used for creating the appender.
*/
Optional<AppenderProvider> appender(String name);
Optional<Provider<LogAppender>> 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);
void register(String name, Provider<LogAppender> appenderProvider);

/**
* Creates a log appender registry.
Expand Down Expand Up @@ -68,7 +68,7 @@ final class DefaultAppenderRegistry implements LogAppenderRegistry {
* properties is complicated particularly because we want to support Spring Boots
* configuration OOB.
*/
private final Map<String, AppenderProvider> providers = new ConcurrentHashMap<>();
private final Map<String, Provider<LogAppender>> providers = new ConcurrentHashMap<>();

static final Property<URI> fileProperty = Property.builder().toURI().build(LogProperties.FILE_PROPERTY);

Expand Down Expand Up @@ -101,12 +101,14 @@ private static LogAppender defaultConsoleAppender(LogConfig config) {
}

static Optional<LogAppender> fileAppender(LogConfig config) {
String name = LogAppender.FILE_APPENDER_NAME;
var outputProperty = outputProperty(LogAppender.APPENDER_OUTPUT_PROPERTY, name, config);
final String name = LogAppender.FILE_APPENDER_NAME;
var outputProperty = fileProperty //
.map(u -> config.outputRegistry().output(u, name, config.properties()));
var encoderProperty = encoderProperty(LogAppender.APPENDER_ENCODER_PROPERTY, name, config);

return fileProperty //
.map(u -> appender(name, config, outputProperty, encoderProperty))
.get(config.properties())
.map(u -> appender(name, config, outputProperty, encoderProperty)) //
.get(config.properties()) //
.optional();
}

Expand Down Expand Up @@ -198,12 +200,12 @@ private static Property<LogEncoder> encoderProperty(String propertyName, String
}

@Override
public Optional<AppenderProvider> appender(String name) {
public Optional<Provider<LogAppender>> appender(String name) {
return Optional.ofNullable(providers.get(name));
}

@Override
public void register(String name, AppenderProvider appenderProvider) {
public void register(String name, Provider<LogAppender> appenderProvider) {
providers.put(name, appenderProvider);

}
Expand Down
34 changes: 34 additions & 0 deletions core/src/main/java/io/jstach/rainbowgum/LogConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,40 @@ public static Builder builder() {
*/
public ServiceRegistry serviceRegistry();

/**
* A factory that may need config to provide. <strong>Most components implements this
* interface so that you can use already created instances</strong>.
*
* @param <T> component
*/
@FunctionalInterface
public interface Provider<T> {

/**
* Creates the component from config. The component is not always guaranteed to be
* new object.
* @param config config.
* @return component.
*/
T provide(LogConfig config);

/**
* Convenience for flattening nullable providers.
* @param <U> component
* @param provider nullable provider
* @param config config used to provide if not null.
* @return maybe null component.
*/
@SuppressWarnings("exports")
public static <U> @Nullable U provideOrNull(@Nullable Provider<U> provider, LogConfig config) {
if (provider == null) {
return null;
}
return provider.provide(config);
}

}

/**
* Config Change Publisher.
*/
Expand Down
7 changes: 6 additions & 1 deletion core/src/main/java/io/jstach/rainbowgum/LogEncoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
* @see LogAppender
* @see StringBuilderBuffer
*/
public interface LogEncoder {
public interface LogEncoder extends LogConfig.Provider<LogEncoder> {

/**
* Creates a <strong>new</strong> buffer. The encoder should not try to reuse buffers
Expand Down Expand Up @@ -86,6 +86,11 @@ public interface EncoderProvider {

}

@Override
default LogEncoder provide(LogConfig config) {
return this;
}

/**
* Encoders buffer.
*/
Expand Down
6 changes: 5 additions & 1 deletion core/src/main/java/io/jstach/rainbowgum/LogOutput.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
* @see LogOutput.OutputProvider
* @see Buffer
*/
public interface LogOutput extends LogLifecycle, Flushable {
public interface LogOutput extends LogLifecycle, Flushable, LogConfig.Provider<LogOutput> {

/**
* {@link FileDescriptor#err} URI scheme.
Expand Down Expand Up @@ -70,6 +70,10 @@ private static URI uri(String s) {
}
}

default LogOutput provide(LogConfig config) {
return this;
}

/**
* Finds output based on URI.
*/
Expand Down
10 changes: 0 additions & 10 deletions core/src/main/java/io/jstach/rainbowgum/LogProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -468,16 +468,6 @@ static String concatKey(String prefix, String name) {
* @return interpolated property name.
*/
static String interpolateKey(String name, Map<String, String> parameters) {

// if (validate) {
// StringBuilder error = new StringBuilder();
// for (Map.Entry<String, String> entry : parameters.entrySet()) {
// String key = entry.getKey();
// String p = "{" + key + "}";
// if (! name.contains(p)) {
// }
// }
// }
for (Map.Entry<String, String> entry : parameters.entrySet()) {
name = name.replace("{" + entry.getKey() + "}", entry.getValue());
}
Expand Down
10 changes: 3 additions & 7 deletions core/src/main/java/io/jstach/rainbowgum/LogRouter.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -19,8 +18,6 @@

import org.eclipse.jdt.annotation.Nullable;

import io.jstach.rainbowgum.LogAppender.AppenderProvider;
import io.jstach.rainbowgum.LogProperties.Property;
import io.jstach.rainbowgum.LogPublisher.PublisherProvider;
import io.jstach.rainbowgum.LogRouter.RootRouter;
import io.jstach.rainbowgum.LogRouter.Route;
Expand Down Expand Up @@ -181,7 +178,7 @@ public final class Builder extends LevelResolver.AbstractBuilder<Builder> {

private final LogConfig config;

private List<AppenderProvider> appenders = new ArrayList<>();
private List<LogConfig.Provider<LogAppender>> appenders = new ArrayList<>();

private Builder(LogConfig config) {
this.config = config;
Expand Down Expand Up @@ -216,7 +213,7 @@ public Builder appender(String name, Consumer<LogAppender.Builder> consumer) {
* @param appender appender provider.
* @return this builder.
*/
public Builder appender(AppenderProvider appender) {
public Builder appender(LogConfig.Provider<LogAppender> appender) {
this.appenders.add(appender);
return self();
}
Expand All @@ -238,11 +235,10 @@ public Builder publisher(PublisherProvider publisher) {
Router build() {
var levelResolver = buildLevelResolver(config.levelResolver());
var publisher = this.publisher;
List<AppenderProvider> appenders = new ArrayList<>(this.appenders);
List<LogConfig.Provider<LogAppender>> appenders = new ArrayList<>(this.appenders);
if (appenders.isEmpty()) {
DefaultAppenderRegistry.defaultAppenders(config) //
.stream() //
.<AppenderProvider>map(a -> (c -> a)) //
.forEach(appenders::add);
}
if (publisher == null) {
Expand Down
Loading

0 comments on commit c934c3b

Please sign in to comment.