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 @@ import ch.qos.logback.core.spi.ContextAwareBase;
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 class DefaultConfigurator extends ContextAwareBase implements Configurato
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 @@ import ch.qos.logback.core.joran.spi.RuleStore;
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 class RootAutoSelectAppenderAction extends Action {
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) {}
-
- private boolean setAppender(InterpretationContext ic, Logger rootLogger, String 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;
- }
+ public void end(SaxEventInterpretationContext ic, String name) {}
+ private void setAppender(Logger rootLogger, String appenderName) {
addInfo("Use appender: " + appenderName);
+
+ 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();
+
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 @@
-
-