Bump slf4j to 2.x and logback to 1.4

This commit is contained in:
Stephan Schnabel 2023-07-02 16:12:38 +02:00
parent 42c94e00dc
commit 1678eadac2
Signed by: stephan.schnabel
GPG key ID: E07AF5BA239FE543
13 changed files with 137 additions and 93 deletions

View file

@ -12,5 +12,3 @@
2. if GCP is detected gcp appender will be used 2. if GCP is detected gcp appender will be used
3. if Kubernetes is detected json appender will be used 3. if Kubernetes is detected json appender will be used
4. console appender else 4. console appender else
*IMPORTENT*: only works without custom `logback.xml`

View file

@ -6,8 +6,6 @@ If no `logback.xml` by user is provided a default [logback.xml](../../src/main/r
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false"> <configuration debug="false" scan="false">
<include resource="io/kokuwa/logback/base.xml" />
<logger name="io.micronaut.logging.PropertiesLoggingLevelsConfigurer" levels="WARN" /> <logger name="io.micronaut.logging.PropertiesLoggingLevelsConfigurer" levels="WARN" />
<root level="INFO"> <root level="INFO">

20
pom.xml
View file

@ -70,6 +70,8 @@
<!-- ===================================================================== --> <!-- ===================================================================== -->
<version.io.micronaut>3.9.4</version.io.micronaut> <version.io.micronaut>3.9.4</version.io.micronaut>
<version.org.slf4j>2.0.7</version.org.slf4j>
<version.ch.qos.logback>1.4.8</version.ch.qos.logback>
</properties> </properties>
@ -82,6 +84,21 @@
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${version.org.slf4j}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${version.ch.qos.logback}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${version.ch.qos.logback}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>
@ -181,6 +198,9 @@
</goals> </goals>
<configuration> <configuration>
<parallelThreads>0.5C</parallelThreads> <parallelThreads>0.5C</parallelThreads>
<!-- logback 1.3+ is not supported by micronaut-->
<!-- https://github.com/micronaut-projects/micronaut-core/issues/8810 -->
<pomExcludes>level-from-micronaut/pom.xml</pomExcludes>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

View file

@ -49,6 +49,8 @@
<version.io.kokuwa.micronaut.logging>@project.version@</version.io.kokuwa.micronaut.logging> <version.io.kokuwa.micronaut.logging>@project.version@</version.io.kokuwa.micronaut.logging>
<version.io.micronaut>@version.io.micronaut@</version.io.micronaut> <version.io.micronaut>@version.io.micronaut@</version.io.micronaut>
<version.org.slf4j>@version.org.slf4j@</version.org.slf4j>
<version.ch.qos.logback>@version.ch.qos.logback@</version.ch.qos.logback>
</properties> </properties>
@ -66,6 +68,21 @@
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${version.org.slf4j}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${version.ch.qos.logback}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${version.ch.qos.logback}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>

View file

@ -1,8 +1,8 @@
package io.kokuwa.micronaut.logging.configurator; package io.kokuwa.micronaut.logging.configurator;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.Configurator; 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.joran.spi.JoranException;
import ch.qos.logback.core.spi.ContextAwareBase; 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 { public class DefaultConfigurator extends ContextAwareBase implements Configurator {
@Override @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"); var base = DefaultConfigurator.class.getResource("/io/kokuwa/logback/logback-default.xml");
if (base == null) { if (base == null) {
addError("Failed to find logback.xml from io.kokuwa:micronaut-logging"); addError("Failed to find logback.xml from io.kokuwa:micronaut-logging");
return; return ExecutionStatus.NEUTRAL;
} }
try { try {
@ -29,8 +34,9 @@ public class DefaultConfigurator extends ContextAwareBase implements Configurato
configurator.doConfigure(base); configurator.doConfigure(base);
} catch (JoranException e) { } catch (JoranException e) {
addError("Failed to load logback.xml from io.kokuwa:micronaut-logging", 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;
} }
} }

View file

@ -12,8 +12,8 @@ import ch.qos.logback.core.joran.spi.RuleStore;
public class MicronautJoranConfigurator extends JoranConfigurator { public class MicronautJoranConfigurator extends JoranConfigurator {
@Override @Override
public void addInstanceRules(RuleStore rs) { public void addElementSelectorAndActionAssociations(RuleStore rs) {
super.addInstanceRules(rs); super.addElementSelectorAndActionAssociations(rs);
rs.addRule(new ElementSelector("configuration/root/autoAppender"), new RootAutoSelectAppenderAction()); rs.addRule(new ElementSelector("configuration/root/autoAppender"), () -> new RootAutoSelectAppenderAction());
} }
} }

View file

@ -1,16 +1,18 @@
package io.kokuwa.micronaut.logging.configurator; package io.kokuwa.micronaut.logging.configurator;
import java.util.Map; import java.util.Optional;
import org.xml.sax.Attributes;
import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender; 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.Action;
import ch.qos.logback.core.joran.action.ActionConst; import ch.qos.logback.core.joran.spi.SaxEventInterpretationContext;
import ch.qos.logback.core.joran.spi.InterpretationContext; import io.kokuwa.micronaut.logging.layout.GcpJsonLayout;
import io.kokuwa.micronaut.logging.layout.JsonLayout;
import io.micronaut.core.util.StringUtils; import io.micronaut.core.util.StringUtils;
/** /**
@ -27,9 +29,16 @@ public class RootAutoSelectAppenderAction extends Action {
private static final String APPENDER_JSON = "JSON"; private static final String APPENDER_JSON = "JSON";
private static final String APPENDER_GCP = "GCP"; private static final String APPENDER_GCP = "GCP";
private static final String LOGBACK_APPENDER = "LOGBACK_APPENDER"; 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 @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 rootLogger = LoggerContext.class.cast(context).getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
var rootLoggerAppenders = rootLogger.iteratorForAppenders(); var rootLoggerAppenders = rootLogger.iteratorForAppenders();
@ -38,36 +47,89 @@ public class RootAutoSelectAppenderAction extends Action {
return; return;
} }
var envAppender = System.getenv(LOGBACK_APPENDER); var envAppender = env(LOGBACK_APPENDER, null);
if (envAppender != null && setAppender(ic, rootLogger, envAppender)) { if (envAppender != null) {
setAppender(rootLogger, envAppender);
return; return;
} }
if (IS_KUBERNETES && setAppender(ic, rootLogger, APPENDER_JSON)) { if (IS_KUBERNETES) {
setAppender(rootLogger, APPENDER_JSON);
return; return;
} }
if (IS_GCP && setAppender(ic, rootLogger, APPENDER_GCP)) { if (IS_GCP) {
setAppender(rootLogger, APPENDER_GCP);
return; return;
} }
setAppender(ic, rootLogger, APPENDER_CONSOLE); setAppender(rootLogger, APPENDER_CONSOLE);
} }
@Override @Override
public void end(InterpretationContext ic, String name) {} public void end(SaxEventInterpretationContext ic, String name) {}
private boolean setAppender(InterpretationContext ic, Logger rootLogger, String appenderName) {
@SuppressWarnings("unchecked")
var appenderBag = (Map<String, Appender<ILoggingEvent>>) 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;
}
private void setAppender(Logger rootLogger, String appenderName) {
addInfo("Use appender: " + appenderName); addInfo("Use appender: " + appenderName);
Layout<ILoggingEvent> 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<ILoggingEvent>();
encoder.setContext(context);
encoder.setLayout(layout);
encoder.start();
var appender = new ConsoleAppender<ILoggingEvent>();
appender.setContext(context);
appender.setName(appenderName);
appender.setEncoder(encoder);
appender.start();
rootLogger.addAppender(appender); rootLogger.addAppender(appender);
return true; }
private Layout<ILoggingEvent> console() {
var layout = new PatternLayout();
layout.setContext(context);
layout.setPattern(env(LOGBACK_PATTERN, LOGBACK_PATTERN_DEFAULT));
return layout;
}
private Layout<ILoggingEvent> json() {
var layout = new JsonLayout();
layout.setContext(context);
return layout;
}
private Layout<ILoggingEvent> gcp() {
var layout = new GcpJsonLayout();
layout.setContext(context);
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;
} }
} }

View file

@ -1,18 +1,6 @@
{ {
"resources": { "resources": {
"includes": [ "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" "pattern": "\\Qio/kokuwa/logback/logback-default.xml\\E"
}, },

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>${CONSOLE_LOG_JANSI:-true}</withJansi>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN:-%cyan(%d{HH:mm:ss.SSS}) %gray(%-6.6thread) %highlight(%-5level) %magenta(%32logger{32}) %mdc %msg%n}</pattern>
<charset>${CONSOLE_LOG_CHARSET:-default}</charset>
</encoder>
</appender>
</included>

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="GCP" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="io.kokuwa.micronaut.logging.layout.GcpJsonLayout">
<serviceName>${SERVICE_NAME}</serviceName>
<serviceVersion>${SERVICE_VERSION}</serviceVersion>
</layout>
</encoder>
</appender>
</included>

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="io.kokuwa.micronaut.logging.layout.JsonLayout" />
</encoder>
</appender>
</included>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<include resource="io/kokuwa/logback/appender-console.xml" />
<include resource="io/kokuwa/logback/appender-json.xml" />
<include resource="io/kokuwa/logback/appender-gcp.xml" />
</included>

View file

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false"> <configuration debug="false" scan="false">
<include resource="io/kokuwa/logback/base.xml" />
<logger name="io.micronaut.logging.PropertiesLoggingLevelsConfigurer" levels="WARN" /> <logger name="io.micronaut.logging.PropertiesLoggingLevelsConfigurer" levels="WARN" />
<root level="INFO"> <root level="INFO">