Implement JSON Logger configuration#74
Open
JavaSaBr wants to merge 2 commits into
Open
Conversation
|
Contributor
There was a problem hiding this comment.
Pull request overview
This PR adds a JSON-based logger configuration loader (via Java ServiceLoader) and updates the logger API/implementations to consistently refer to the “root logger” (instead of “default logger”), along with related config/constant updates across the logger modules.
Changes:
- Added new
:rlib-logger-impl-jsonmodule that loadsrlib.logger.json/rlib.logger-test.jsonand registers itself via SPI. - Introduced/updated SPI package for providing additional
LoggerConfigLoaderimplementations discovered viaServiceLoader. - Renamed
LoggerFactory#getDefault()togetRootLogger()and propagated the change across implementations and tests; centralizedROOTlogger name underLoggerFactory.
Reviewed changes
Copilot reviewed 27 out of 27 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| settings.gradle | Registers new JSON logger module and repositions SLF4J impl module include. |
| rlib-logger-slf4j/src/main/java/javasabr/rlib/logger/slf4j/Slf4jLoggerFactory.java | Renames factory method to getRootLogger(). |
| rlib-logger-impl/src/test/java/javasabr/rlib/logger/impl/DefaultLoggerTest.java | Updates root logger name constant usage in tests. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/DefaultLoggerService.java | Exposes/stores a root logger and uses LoggerFactory.ROOT_LOGGER_NAME. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/DefaultLoggerFactory.java | Renames factory method to getRootLogger(). |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/render/impl/pattern/PatternLogMessageRender.java | Adds args-map constructor and constants for buffer sizing/pattern extraction. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/render/impl/CustomLogMessageRender.java | Introduces base class for custom renders with args-based ctor. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/loader/spi/package-info.java | Marks SPI package as @NullMarked. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/loader/spi/LoggerConfigLoadersProvider.java | Moves provider interface into loader.spi package. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/loader/LoggerConfigResolver.java | Loads additional config loaders via ServiceLoader SPI. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/loader/impl/PropertyLoggerConfigLoader.java | Switches ROOT name constant source to LoggerFactory. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/loader/impl/DefaultLoggerConfigLoader.java | Switches ROOT name constant source to LoggerFactory. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/impl/DefaultLoggerConfig.java | Switches ROOT name constant source to LoggerFactory when resolving levels/keys. |
| rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/consumer/impl/CustomLogMessageConsumer.java | Introduces base class for custom consumers with args-based ctor. |
| rlib-logger-impl-json/src/test/resources/rlib.logger-test.json | Adds JSON test configuration fixture. |
| rlib-logger-impl-json/src/test/java/javasabr/rlib/logger/impl/config/loader/json/JsonLoggerConfigLoaderTest.java | Adds coverage for JSON loader end-to-end behavior with custom consumer/render. |
| rlib-logger-impl-json/src/main/resources/META-INF/services/javasabr.rlib.logger.impl.config.loader.spi.LoggerConfigLoadersProvider | Registers JSON loaders provider for ServiceLoader. |
| rlib-logger-impl-json/src/main/java/javasabr/rlib/logger/impl/config/loader/json/package-info.java | Marks JSON loader package as @NullMarked. |
| rlib-logger-impl-json/src/main/java/javasabr/rlib/logger/impl/config/loader/json/JsonLoggerConfigLoadersProvider.java | Supplies the JSON loader via SPI. |
| rlib-logger-impl-json/src/main/java/javasabr/rlib/logger/impl/config/loader/json/JsonLoggerConfigLoader.java | Implements JSON parsing + config building + reflection for custom components. |
| rlib-logger-impl-json/src/main/java/javasabr/rlib/logger/impl/config/loader/json/dto/package-info.java | Marks DTO package as @NullMarked. |
| rlib-logger-impl-json/src/main/java/javasabr/rlib/logger/impl/config/loader/json/dto/JsonLoggerConfigDto.java | Adds DTO model for JSON config (renders/consumers/loggers). |
| rlib-logger-impl-json/build.gradle | Declares new module plugins and Jackson dependencies. |
| rlib-logger-api/src/main/java/javasabr/rlib/logger/api/LoggerManager.java | Routes “default logger” accessor to getRootLogger(). |
| rlib-logger-api/src/main/java/javasabr/rlib/logger/api/LoggerFactory.java | Adds ROOT_LOGGER_NAME constant and renames getDefault() to getRootLogger(). |
| rlib-logger-api/src/main/java/javasabr/rlib/logger/api/impl/NoOpsLoggerFactory.java | Renames factory method to getRootLogger(). |
| gradle/libs.versions.toml | Adds Jackson version and library coordinates to the version catalog. |
| import javasabr.rlib.logger.impl.config.render.impl.pattern.PatternLogMessageRender; | ||
| import lombok.AccessLevel; | ||
| import lombok.experimental.FieldDefaults; | ||
| import tools.jackson.databind.ObjectMapper; |
Comment on lines
+128
to
+130
| if (StringUtils.isBlank(className)) { | ||
| throw new IllegalArgumentException("'class'' is required for custom render"); | ||
| } |
Comment on lines
+135
to
+137
| var targetClass = (Class<? extends CustomLogMessageRender>) classLoader.loadClass(className); | ||
| Constructor<? extends CustomLogMessageRender> constructor = targetClass.getDeclaredConstructor(Map.class); | ||
| return constructor.newInstance(renderDto.args()); |
Comment on lines
+158
to
+160
| if (StringUtils.isBlank(className)) { | ||
| throw new IllegalArgumentException("'class'' is required for custom consumer"); | ||
| } |
Comment on lines
+165
to
+168
| var targetClass = (Class<? extends CustomLogMessageConsumer>) classLoader.loadClass(className); | ||
| Constructor<? extends CustomLogMessageConsumer> constructor = targetClass | ||
| .getDeclaredConstructor(LogMessageRender.class, Map.class); | ||
| return constructor.newInstance(render, consumerDto.args()); |
Comment on lines
+27
to
+29
| public LoggerDto { | ||
| consumerNames = consumerNames == null ? Set.of() : Set.copyOf(consumerNames); | ||
| } |
Comment on lines
+61
to
+63
| public ConsumerDto { | ||
| args = args == null ? Map.of() : Map.copyOf(args); | ||
| } |
| var loader = new JsonLoggerConfigLoader(); | ||
| MutableArray<String> receivedMessages = CONSUMED_MESSAGES.get(); | ||
|
|
||
| //when: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
This branch adds JSON-based logger configuration support through a new
rlib-logger-impl-jsonmodule integrated into the existing loader pipeline. It introduces a structured JSON config model for loggers, renders, and consumers (including custom implementations loaded reflectively), and wires custom consumers to use configured renders. The branch also normalizes root-logger naming in API/impl layers and updates logger factory naming from “default” to “root”.Changes Summary
1. New feature: JSON logger configuration module
:rlib-logger-impl-jsonand included it insettings.gradle.gradle/libs.versions.tomland module dependencies inrlib-logger-impl-json/build.gradle.JsonLoggerConfigLoader:rlib.logger-test.json->rlib.logger.jsonObjectMapperLoggerConfigBuilderJsonLoggerConfigDtowith nested records/enums:RenderType:SIMPLE,PATTERN,CUSTOMConsumerType:CONSOLE,CUSTOMnullnormalization for lists/maps/sets and basic validation for render entries2. Loader SPI integration
JsonLoggerConfigLoadersProviderand service registration:rlib-logger-impl-json/src/main/resources/META-INF/services/javasabr.rlib.logger.impl.config.loader.spi.LoggerConfigLoadersProviderLoggerConfigResolverto load providers fromjavasabr.rlib.logger.impl.config.loader.spi.LoggerConfigLoadersProvider.LoggerConfigLoadersProviderinterface moved to...config.loader.spipackage.3. Custom render/consumer extensibility updates
CustomLogMessageRender.CustomLogMessageConsumerconstructor to accept both:LogMessageRender renderMap<String, Object> args(LogMessageRender, Map<String, Object>), so configured render is now available to custom consumers.PatternLogMessageRenderwith argument-based constructor:pattern(required, string)initBufferSize(optional,intor parsable string, default256)4. API/refactoring changes around root logger naming
LoggerFactorynow definesROOT_LOGGER_NAME = "ROOT".LoggerFactory#getDefault()was renamed togetRootLogger(); implementations updated:DefaultLoggerFactoryNoOpsLoggerFactorySlf4jLoggerFactoryLoggerManager#getDefaultLogger()now delegates togetRootLogger().LoggerFactory.ROOT_LOGGER_NAME(replacing impl-local constant usage).5. Tests and fixtures
JsonLoggerConfigLoaderTestwith custom test render/consumer classes and assertions for:rlib.logger-test.jsoncovering:6. Runtime flow diagram
7. Usage samples
{ "renders": [ { "name": "consolePattern", "type": "PATTERN", "args": { "pattern": "%level %msg" } } ], "consumers": [ { "name": "console", "type": "CONSOLE", "render": "consolePattern" } ], "loggers": [ { "name": "ROOT", "level": "INFO", "consumers": ["console"] } ] }