From ca14eb482f636031285861e57e29e5776a9a9449 Mon Sep 17 00:00:00 2001 From: Stephan Schnabel Date: Mon, 15 May 2023 08:51:11 +0200 Subject: [PATCH] Bump slf4j to 2.x and logback to 1.4 --- docs/features/logback_appender.md | 2 - docs/features/logback_default.md | 2 - pom.xml | 8 +- .../configurator/DefaultConfigurator.java | 14 ++- .../MicronautJoranConfigurator.java | 6 +- .../RootAutoSelectAppenderAction.java | 117 ++++++++++++++---- .../micronaut-logging/resource-config.json | 12 -- .../io/kokuwa/logback/appender-console.xml | 12 -- .../io/kokuwa/logback/appender-gcp.xml | 17 --- .../io/kokuwa/logback/appender-json.xml | 15 --- src/main/resources/io/kokuwa/logback/base.xml | 8 -- .../io/kokuwa/logback/logback-default.xml | 2 - 12 files changed, 112 insertions(+), 103 deletions(-) delete mode 100644 src/main/resources/io/kokuwa/logback/appender-console.xml delete mode 100644 src/main/resources/io/kokuwa/logback/appender-gcp.xml delete mode 100644 src/main/resources/io/kokuwa/logback/appender-json.xml delete mode 100644 src/main/resources/io/kokuwa/logback/base.xml diff --git a/docs/features/logback_appender.md b/docs/features/logback_appender.md index 1975e8b..d71885b 100644 --- a/docs/features/logback_appender.md +++ b/docs/features/logback_appender.md @@ -12,5 +12,3 @@ 2. if GCP is detected gcp appender will be used 3. if Kubernetes is detected json appender will be used 4. console appender else - -*IMPORTENT*: only works without custom `logback.xml` diff --git a/docs/features/logback_default.md b/docs/features/logback_default.md index 3a73735..5b34f1a 100644 --- a/docs/features/logback_default.md +++ b/docs/features/logback_default.md @@ -6,8 +6,6 @@ If no `logback.xml` by user is provided a default [logback.xml](../../src/main/r - - diff --git a/pom.xml b/pom.xml index a16aadb..9c49a9c 100644 --- a/pom.xml +++ b/pom.xml @@ -100,12 +100,12 @@ - 1.2.12 + 1.4.7 0.1.5 4.0.0-SNAPSHOT 3.9.1 3.11.0 - 1.7.36 + 2.0.7 @@ -223,7 +223,6 @@ ch.qos.logback.contrib logback-jackson - runtime @@ -370,6 +369,9 @@ false true true + + + level-from-micronaut/pom.xml diff --git a/src/main/java/io/kokuwa/micronaut/logging/configurator/DefaultConfigurator.java b/src/main/java/io/kokuwa/micronaut/logging/configurator/DefaultConfigurator.java index 1d808a9..f84feb8 100644 --- a/src/main/java/io/kokuwa/micronaut/logging/configurator/DefaultConfigurator.java +++ b/src/main/java/io/kokuwa/micronaut/logging/configurator/DefaultConfigurator.java @@ -1,8 +1,8 @@ package io.kokuwa.micronaut.logging.configurator; -import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.Configurator; +import ch.qos.logback.classic.util.DefaultJoranConfigurator; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.spi.ContextAwareBase; @@ -14,12 +14,17 @@ public class DefaultConfigurator extends ContextAwareBase implements Configurator { @Override - public void configure(LoggerContext loggerContext) { + public ExecutionStatus configure(LoggerContext loggerContext) { + + if (new DefaultJoranConfigurator().findURLOfDefaultConfigurationFile(false) != null) { + // there is a default logback file, use this one instead of our default + return ExecutionStatus.INVOKE_NEXT_IF_ANY; + } var base = DefaultConfigurator.class.getResource("/io/kokuwa/logback/logback-default.xml"); if (base == null) { addError("Failed to find logback.xml from io.kokuwa:micronaut-logging"); - return; + return ExecutionStatus.NEUTRAL; } try { @@ -29,8 +34,9 @@ public void configure(LoggerContext loggerContext) { configurator.doConfigure(base); } catch (JoranException e) { addError("Failed to load logback.xml from io.kokuwa:micronaut-logging", e); + return ExecutionStatus.NEUTRAL; } - loggerContext.getLogger("io.micronaut.logging.PropertiesLoggingLevelsConfigurer").setLevel(Level.WARN); + return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY; } } diff --git a/src/main/java/io/kokuwa/micronaut/logging/configurator/MicronautJoranConfigurator.java b/src/main/java/io/kokuwa/micronaut/logging/configurator/MicronautJoranConfigurator.java index f89db16..a1010d7 100644 --- a/src/main/java/io/kokuwa/micronaut/logging/configurator/MicronautJoranConfigurator.java +++ b/src/main/java/io/kokuwa/micronaut/logging/configurator/MicronautJoranConfigurator.java @@ -12,8 +12,8 @@ public class MicronautJoranConfigurator extends JoranConfigurator { @Override - public void addInstanceRules(RuleStore rs) { - super.addInstanceRules(rs); - rs.addRule(new ElementSelector("configuration/root/autoAppender"), new RootAutoSelectAppenderAction()); + public void addElementSelectorAndActionAssociations(RuleStore rs) { + super.addElementSelectorAndActionAssociations(rs); + rs.addRule(new ElementSelector("configuration/root/autoAppender"), () -> new RootAutoSelectAppenderAction()); } } diff --git a/src/main/java/io/kokuwa/micronaut/logging/configurator/RootAutoSelectAppenderAction.java b/src/main/java/io/kokuwa/micronaut/logging/configurator/RootAutoSelectAppenderAction.java index b490a35..65b08ba 100644 --- a/src/main/java/io/kokuwa/micronaut/logging/configurator/RootAutoSelectAppenderAction.java +++ b/src/main/java/io/kokuwa/micronaut/logging/configurator/RootAutoSelectAppenderAction.java @@ -1,16 +1,19 @@ package io.kokuwa.micronaut.logging.configurator; -import java.util.Map; - -import org.xml.sax.Attributes; +import java.util.Optional; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.PatternLayout; import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.Appender; +import ch.qos.logback.contrib.jackson.JacksonJsonFormatter; +import ch.qos.logback.contrib.json.classic.JsonLayout; +import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.Layout; +import ch.qos.logback.core.encoder.LayoutWrappingEncoder; import ch.qos.logback.core.joran.action.Action; -import ch.qos.logback.core.joran.action.ActionConst; -import ch.qos.logback.core.joran.spi.InterpretationContext; +import ch.qos.logback.core.joran.spi.SaxEventInterpretationContext; +import io.kokuwa.micronaut.logging.layout.GcpJsonLayout; import io.micronaut.core.util.StringUtils; /** @@ -27,9 +30,16 @@ public class RootAutoSelectAppenderAction extends Action { private static final String APPENDER_JSON = "JSON"; private static final String APPENDER_GCP = "GCP"; private static final String LOGBACK_APPENDER = "LOGBACK_APPENDER"; + private static final String LOGBACK_PATTERN = "LOGBACK_PATTERN"; + private static final String LOGBACK_PATTERN_DEFAULT = "%cyan(%d{HH:mm:ss.SSS})" + + " %gray(%-6.6thread)" + + " %highlight(%-5level)" + + " %magenta(%32logger{32})" + + " %mdc" + + " %msg%n"; @Override - public void begin(InterpretationContext ic, String name, Attributes attributes) { + public void begin(SaxEventInterpretationContext ic, String name, org.xml.sax.Attributes attributes) { var rootLogger = LoggerContext.class.cast(context).getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); var rootLoggerAppenders = rootLogger.iteratorForAppenders(); @@ -38,36 +48,97 @@ public void begin(InterpretationContext ic, String name, Attributes attributes) return; } - var envAppender = System.getenv(LOGBACK_APPENDER); - if (envAppender != null && setAppender(ic, rootLogger, envAppender)) { + var envAppender = env(LOGBACK_APPENDER, null); + if (envAppender != null) { + setAppender(rootLogger, envAppender); return; } - if (IS_KUBERNETES && setAppender(ic, rootLogger, APPENDER_JSON)) { + if (IS_KUBERNETES) { + setAppender(rootLogger, APPENDER_JSON); return; } - if (IS_GCP && setAppender(ic, rootLogger, APPENDER_GCP)) { + if (IS_GCP) { + setAppender(rootLogger, APPENDER_GCP); return; } - setAppender(ic, rootLogger, APPENDER_CONSOLE); + setAppender(rootLogger, APPENDER_CONSOLE); } @Override - public void end(InterpretationContext ic, String name) {} + public void end(SaxEventInterpretationContext ic, String name) {} - private boolean setAppender(InterpretationContext ic, Logger rootLogger, String appenderName) { + private void setAppender(Logger rootLogger, String appenderName) { + addInfo("Use appender: " + appenderName); - @SuppressWarnings("unchecked") - var appenderBag = (Map>) ic.getObjectMap().get(ActionConst.APPENDER_BAG); - var appender = appenderBag.get(appenderName); - if (appender == null) { - addError("Could not find an appender named [" + appenderName - + "]. Did you define it below instead of above in the configuration file?"); - return false; + Layout layout; + switch (appenderName) { + case APPENDER_JSON: + layout = json(); + break; + case APPENDER_GCP: + layout = gcp(); + break; + case APPENDER_CONSOLE: + layout = console(); + break; + default: + addError("Appender " + appenderName + " not found. Using console ..."); + layout = console(); } + layout.start(); + + var encoder = new LayoutWrappingEncoder(); + encoder.setContext(context); + encoder.setLayout(layout); + encoder.start(); + + var appender = new ConsoleAppender(); + appender.setContext(context); + appender.setName(appenderName); + appender.setEncoder(encoder); + appender.start(); - addInfo("Use appender: " + appenderName); rootLogger.addAppender(appender); - return true; + } + + private Layout console() { + var layout = new PatternLayout(); + layout.setContext(context); + layout.setPattern(env(LOGBACK_PATTERN, LOGBACK_PATTERN_DEFAULT)); + return layout; + } + + private Layout json() { + var layout = new JsonLayout(); + layout.setContext(context); + layout.setJsonFormatter(new JacksonJsonFormatter()); + layout.setAppendLineSeparator(true); + layout.setIncludeContextName(false); + layout.setIncludeMessage(true); + return layout; + } + + private Layout gcp() { + var layout = new GcpJsonLayout(); + layout.setContext(context); + layout.setJsonFormatter(new JacksonJsonFormatter()); + layout.setAppendLineSeparator(true); + layout.setIncludeContextName(false); + layout.setIncludeMessage(true); + layout.setServiceName(env("SERVICE_NAME", null)); + layout.setServiceVersion(env("SERVICE_VERSION", null)); + return layout; + } + + private String env(String name, String defaultValue) { + var envValue = Optional.ofNullable(System.getenv(name)).map(String::trim).filter(StringUtils::isNotEmpty); + var finalValue = envValue.orElse(defaultValue); + if (envValue.isPresent()) { + addInfo("Use provided config: " + name + "=" + finalValue); + } else { + addInfo("Use default config: " + name + "=" + finalValue); + } + return finalValue; } } diff --git a/src/main/resources/META-INF/native-image/io.kokuwa.micronaut/micronaut-logging/resource-config.json b/src/main/resources/META-INF/native-image/io.kokuwa.micronaut/micronaut-logging/resource-config.json index 46d679d..3a97089 100644 --- a/src/main/resources/META-INF/native-image/io.kokuwa.micronaut/micronaut-logging/resource-config.json +++ b/src/main/resources/META-INF/native-image/io.kokuwa.micronaut/micronaut-logging/resource-config.json @@ -1,18 +1,6 @@ { "resources": { "includes": [ - { - "pattern": "\\Qio/kokuwa/logback/appender-console.xml\\E" - }, - { - "pattern": "\\Qio/kokuwa/logback/appender-gcp.xml\\E" - }, - { - "pattern": "\\Qio/kokuwa/logback/appender-json.xml\\E" - }, - { - "pattern": "\\Qio/kokuwa/logback/base.xml\\E" - }, { "pattern": "\\Qio/kokuwa/logback/logback-default.xml\\E" }, diff --git a/src/main/resources/io/kokuwa/logback/appender-console.xml b/src/main/resources/io/kokuwa/logback/appender-console.xml deleted file mode 100644 index e4bfb1d..0000000 --- a/src/main/resources/io/kokuwa/logback/appender-console.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - ${CONSOLE_LOG_JANSI:-true} - - ${CONSOLE_LOG_PATTERN:-%cyan(%d{HH:mm:ss.SSS}) %gray(%-6.6thread) %highlight(%-5level) %magenta(%32logger{32}) %mdc %msg%n} - ${CONSOLE_LOG_CHARSET:-default} - - - - diff --git a/src/main/resources/io/kokuwa/logback/appender-gcp.xml b/src/main/resources/io/kokuwa/logback/appender-gcp.xml deleted file mode 100644 index e847d99..0000000 --- a/src/main/resources/io/kokuwa/logback/appender-gcp.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - ${SERVICE_NAME} - ${SERVICE_VERSION} - - true - true - false - - - - - diff --git a/src/main/resources/io/kokuwa/logback/appender-json.xml b/src/main/resources/io/kokuwa/logback/appender-json.xml deleted file mode 100644 index b850ac7..0000000 --- a/src/main/resources/io/kokuwa/logback/appender-json.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - true - true - false - - - - - diff --git a/src/main/resources/io/kokuwa/logback/base.xml b/src/main/resources/io/kokuwa/logback/base.xml deleted file mode 100644 index 24ae946..0000000 --- a/src/main/resources/io/kokuwa/logback/base.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/main/resources/io/kokuwa/logback/logback-default.xml b/src/main/resources/io/kokuwa/logback/logback-default.xml index 1092ea9..78fe3f0 100644 --- a/src/main/resources/io/kokuwa/logback/logback-default.xml +++ b/src/main/resources/io/kokuwa/logback/logback-default.xml @@ -1,8 +1,6 @@ - -