diff options
4 files changed, 119 insertions, 4 deletions
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java index f6167f6..c4e36de 100644 --- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java +++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java @@ -99,15 +99,17 @@ public class Formatter extends ExtFormatter { List<StructuredParameter> parameters = new ArrayList<>(); Map<String, String> labels = new HashMap<>(); + var providerContext = new ProviderContext(logRecord); + for (var parameterProvider : parameterProviders) { - var parameter = parameterProvider.getParameter(); + var parameter = parameterProvider.getParameter(providerContext); if (parameter != null) { parameters.add(parameter); } } for (var labelProvider : labelProviders) { - var providedLabels = labelProvider.getLabels(); + var providedLabels = labelProvider.getLabels(providerContext); if (providedLabels != null) { for (var label : providedLabels) { labels.put(label.key(), label.value()); @@ -185,4 +187,37 @@ public class Formatter extends ExtFormatter { return ERROR_LEVEL; } } + + /** + * An implementation of {@link LabelProvider.Context} and {@link + * StructuredParameterProvider.Context}. + */ + private static class ProviderContext + implements LabelProvider.Context, StructuredParameterProvider.Context { + + private final String loggerName; + private final long sequenceNumber; + private final String threadName; + + private ProviderContext(ExtLogRecord logRecord) { + loggerName = logRecord.getLoggerName(); + sequenceNumber = logRecord.getSequenceNumber(); + threadName = logRecord.getThreadName(); + } + + @Override + public String loggerName() { + return loggerName; + } + + @Override + public long sequenceNumber() { + return sequenceNumber; + } + + @Override + public String threadName() { + return threadName; + } + } } diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java index 7cca6a0..0298042 100644 --- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java +++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java @@ -47,7 +47,26 @@ public interface LabelProvider { /** * Provides a collection of {@link Label}s to add to each log entry that is logged. * + * <p>If {@link #getLabels(Context)} is implemented, this method is ignored. + * * @return a collection of {@link Label}s to add to each log entry that is logged. + * @see #getLabels(Context) */ - Collection<Label> getLabels(); + default Collection<Label> getLabels() { + return null; + } + + /** + * Provides a collection of {@link Label}s to add to each log entry that is logged. + * + * <p>Delegates to {@link #getLabels()} by default. + * + * @return a collection of {@link Label}s to add to each log entry that is logged. + */ + default Collection<Label> getLabels(Context context) { + return getLabels(); + } + + /** Contextual data available to {@link #getLabels(Context)}. */ + interface Context extends ProviderContext {} } diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java new file mode 100644 index 0000000..08b399a --- /dev/null +++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: © 2022 Matthias Andreas Benkard <code@mail.matthias.benkard.de> +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +package eu.mulk.quarkus.googlecloud.jsonlogging; + +import org.jboss.logmanager.ExtLogRecord; + +/** + * Contextual data available to {@link StructuredParameterProvider} and {@link LabelProvider}. + * + * <p>Provides access to information carried by the {@link ExtLogRecord} that is being formatted and + * that is not taken care of by {@link Formatter} by default. + */ +public interface ProviderContext { + + /** + * The {@link ExtLogRecord#getLoggerName()} property of the log record that is being formatted. + * + * @return {@link ExtLogRecord#getLoggerName()}. + */ + String loggerName(); + + /** + * The {@link ExtLogRecord#getSequenceNumber()} property of the log record that is being + * formatted. + * + * @return {@link ExtLogRecord#getSequenceNumber()}. + */ + long sequenceNumber(); + + /** + * The {@link ExtLogRecord#getThreadName()} property of the log record that is being formatted. + * + * @return {@link ExtLogRecord#getThreadName()}. + */ + String threadName(); +} diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java index b8f80ce..d78f0d8 100644 --- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java +++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java @@ -53,7 +53,30 @@ public interface StructuredParameterProvider { * KeyValueParameter} from this method. This way multiple key–value pairs can be generated by a * single invocation. * + * <p>If {@link #getParameter(Context)} is implemented, this method is ignored. + * * @return a {@link StructuredParameter} to add to each log entry that is logged. + * @see #getParameter(Context) */ - StructuredParameter getParameter(); + default StructuredParameter getParameter() { + return null; + } + + /** + * Provides a {@link StructuredParameter} to add to each log entry that is logged. + * + * <p>It is often useful to return a custom {@link StructuredParameter} rather than a {@link + * KeyValueParameter} from this method. This way multiple key–value pairs can be generated by a + * single invocation. + * + * <p>Delegates to {@link #getParameter()} by default. + * + * @return a {@link StructuredParameter} to add to each log entry that is logged. + */ + default StructuredParameter getParameter(Context context) { + return getParameter(); + } + + /** Contextual data available to {@link #getParameter(Context)}. */ + interface Context extends ProviderContext {} } |