From c6792c4a3b6a79cfe7f38b4c76a4d4abaf45bb2b Mon Sep 17 00:00:00 2001 From: JFronny Date: Sun, 5 May 2024 13:38:58 +0200 Subject: [PATCH] feat(logger): support messages with a throwable and parameters --- .../jfronny/commons/logger/CompactLogger.java | 33 +++++++----------- .../commons/logger/CompoundLogger.java | 12 +++++++ .../commons/logger/DelegateLogger.java | 10 ++++++ .../commons/logger/HotswapLoggerFinder.java | 1 + .../commons/logger/SystemLoggerPlus.java | 10 ++++++ .../logger/impl/DelegateLoggerPlus.java | 8 +++++ .../commons/logger/impl/Formatter.java | 34 +++++++++++++++++++ 7 files changed, 87 insertions(+), 21 deletions(-) create mode 100644 commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/Formatter.java diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompactLogger.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompactLogger.java index b1ef89d..35e14b8 100644 --- a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompactLogger.java +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompactLogger.java @@ -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); } } diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompoundLogger.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompoundLogger.java index 4b23a06..d40fafe 100644 --- a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompoundLogger.java +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/CompoundLogger.java @@ -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); + } + } + } } diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/DelegateLogger.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/DelegateLogger.java index 6264c73..0861791 100644 --- a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/DelegateLogger.java +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/DelegateLogger.java @@ -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); + } + } } diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/HotswapLoggerFinder.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/HotswapLoggerFinder.java index b832b10..da9d5bd 100644 --- a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/HotswapLoggerFinder.java +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/HotswapLoggerFinder.java @@ -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(); } } diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/SystemLoggerPlus.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/SystemLoggerPlus.java index b389c50..1f29135 100644 --- a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/SystemLoggerPlus.java +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/SystemLoggerPlus.java @@ -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); } diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/DelegateLoggerPlus.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/DelegateLoggerPlus.java index 1959778..9bad614 100644 --- a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/DelegateLoggerPlus.java +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/DelegateLoggerPlus.java @@ -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); + } + } } diff --git a/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/Formatter.java b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/Formatter.java new file mode 100644 index 0000000..54c7ef4 --- /dev/null +++ b/commons-logger/src/main/java/io/gitlab/jfronny/commons/logger/impl/Formatter.java @@ -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(); + } + } +}