feat(logger): support messages with a throwable and parameters
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2024-05-05 13:38:58 +02:00
parent ae263e15ea
commit c6792c4a3b
Signed by: Johannes
GPG Key ID: E76429612C2929F4
7 changed files with 87 additions and 21 deletions

View File

@ -1,6 +1,7 @@
package io.gitlab.jfronny.commons.logger;
import io.gitlab.jfronny.commons.StringFormatter;
import io.gitlab.jfronny.commons.logger.impl.Formatter;
import java.text.MessageFormat;
import java.util.MissingResourceException;
@ -24,34 +25,24 @@ public interface CompactLogger extends SystemLoggerPlus {
@Override
default void log(Level level, ResourceBundle resourceBundle, String s, Throwable throwable) {
if (!isLoggable(level)) return;
s = getResourceStringOrMessage(resourceBundle, s);
log(level, s, throwable);
log(level, Formatter.getResourceStringOrMessage(resourceBundle, s), throwable);
}
@Override
default void log(Level level, ResourceBundle resourceBundle, String s, Object... objects) {
if (!isLoggable(level)) return;
s = getResourceStringOrMessage(resourceBundle, s);
if (objects != null && objects.length > 0) {
String[] strings = new String[objects.length];
for (int i = 0; i < objects.length; i++) {
strings[i] = StringFormatter.toString(objects[i]);
}
log(level, new MessageFormat(s).format(strings));
} else {
log(level, s);
}
log(level, Formatter.format(resourceBundle, s, objects));
}
@Override
default void log(Level level, ResourceBundle bundle, String format, Throwable t, Object... params) {
// Also in SystemLoggerPlus.java
if (!isLoggable(level)) return;
log(level, Formatter.format(bundle, format, params), t);
}
@Deprecated(forRemoval = true)
static String getResourceStringOrMessage(ResourceBundle bundle, String msg) {
// This method was taken from SLF4J and modified slightly
if (bundle == null || msg == null) return msg;
try {
return bundle.getString(msg);
} catch (MissingResourceException ex) {
return msg;
} catch (ClassCastException ex) {
return bundle.getObject(msg).toString();
}
return Formatter.getResourceStringOrMessage(bundle, msg);
}
}

View File

@ -1,6 +1,8 @@
package io.gitlab.jfronny.commons.logger;
import io.gitlab.jfronny.commons.logger.impl.Formatter;
import java.util.ResourceBundle;
/**
@ -41,4 +43,14 @@ public class CompoundLogger implements SystemLoggerPlus {
if (logger.isLoggable(level)) logger.log(level, resourceBundle, s, objects);
}
}
@Override
public void log(Level level, ResourceBundle bundle, String format, Throwable t, Object... params) {
for (System.Logger logger : loggers) {
switch (logger) {
case SystemLoggerPlus slp -> slp.log(level, bundle, format, t, params);
case System.Logger sl -> sl.log(level, Formatter.format(bundle, format, params), t);
}
}
}
}

View File

@ -1,5 +1,7 @@
package io.gitlab.jfronny.commons.logger;
import io.gitlab.jfronny.commons.logger.impl.Formatter;
import java.util.ResourceBundle;
/**
@ -36,4 +38,12 @@ public abstract class DelegateLogger implements SystemLoggerPlus {
public void log(Level level, ResourceBundle resourceBundle, String s, Object... objects) {
getDelegate().log(level, resourceBundle, s, objects);
}
@Override
public void log(Level level, ResourceBundle resourceBundle, String format, Throwable t, Object... params) {
switch (getDelegate()) {
case SystemLoggerPlus slp -> slp.log(level, format, t, params);
case System.Logger sl -> sl.log(level, Formatter.format(resourceBundle, format, params), t);
}
}
}

View File

@ -61,6 +61,7 @@ public class HotswapLoggerFinder extends LeveledLoggerFinder {
ServiceLoader.load(LoggerConfiguration.class).forEach(LoggerConfiguration::configure);
} catch (Throwable t) {
System.err.println("Could not initialize LoggerConfiguration");
//noinspection CallToPrintStackTrace
t.printStackTrace();
}
}

View File

@ -1,6 +1,9 @@
package io.gitlab.jfronny.commons.logger;
import io.gitlab.jfronny.commons.logger.impl.DelegateLoggerPlus;
import io.gitlab.jfronny.commons.logger.impl.Formatter;
import java.util.ResourceBundle;
public interface SystemLoggerPlus extends System.Logger {
static SystemLoggerPlus forName(String name) {
@ -11,6 +14,13 @@ public interface SystemLoggerPlus extends System.Logger {
return DelegateLoggerPlus.get(logger);
}
default void log(Level level, ResourceBundle bundle, String format, Throwable t, Object... params) {
// Also in CompactLogger.java
// Copied here for binary compatibility
if (!isLoggable(level)) return;
log(level, Formatter.format(bundle, format, params), t);
}
default void trace(String msg, Object... params) {
log(Level.TRACE, msg, params);
}

View File

@ -33,4 +33,12 @@ public record DelegateLoggerPlus(System.Logger delegate) implements SystemLogger
public void log(Level level, ResourceBundle bundle, String format, Object... params) {
delegate.log(level, bundle, format, params);
}
@Override
public void log(Level level, ResourceBundle bundle, String format, Throwable t, Object... params) {
switch (delegate) {
case SystemLoggerPlus slp -> slp.log(level, format, t, params);
case System.Logger sl -> sl.log(level, Formatter.format(bundle, format, params), t);
}
}
}

View File

@ -0,0 +1,34 @@
package io.gitlab.jfronny.commons.logger.impl;
import io.gitlab.jfronny.commons.StringFormatter;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class Formatter {
public static String format(ResourceBundle bundle, String format, Object... args) {
format = getResourceStringOrMessage(bundle, format);
if (args != null && args.length > 0) {
String[] strings = new String[args.length];
for (int i = 0; i < args.length; i++) {
strings[i] = StringFormatter.toString(args[i]);
}
return new MessageFormat(format).format(strings);
} else {
return format;
}
}
public static String getResourceStringOrMessage(ResourceBundle bundle, String msg) {
// This method was taken from SLF4J and modified slightly
if (bundle == null || msg == null) return msg;
try {
return bundle.getString(msg);
} catch (MissingResourceException ex) {
return msg;
} catch (ClassCastException ex) {
return bundle.getObject(msg).toString();
}
}
}