From b9b55295b23fd49e2bf3bf45e9bb1ed5e87b71e8 Mon Sep 17 00:00:00 2001 From: A-Imal Date: Thu, 9 Nov 2023 16:35:29 +0100 Subject: [PATCH 1/4] Logging > Register our TurboFilter only once. During the HiveMQ start we load our logback.xml which will reset the current context and call the reset which will register the TurboFilter a second time. --- .../src/main/java/com/hivemq/HiveMQEdgeMain.java | 2 ++ .../java/com/hivemq/bootstrap/LoggingBootstrap.java | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeMain.java b/hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeMain.java index c47029fb6..0a6d083d1 100644 --- a/hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeMain.java +++ b/hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeMain.java @@ -146,6 +146,8 @@ protected void stopGateway() { //Stop the API Webserver stopApiServer(); + + LoggingBootstrap.resetLogging(); } protected void initializeApiServer(@NotNull final Injector injector) { diff --git a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java index 22e5fc4b6..6e8262012 100644 --- a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java +++ b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java @@ -50,6 +50,7 @@ public class LoggingBootstrap { private static final List> defaultAppenders = new LinkedList<>(); private static final @NotNull LogLevelModifierTurboFilter logLevelModifierTurboFilter = new LogLevelModifierTurboFilter(); + private static final @NotNull LogbackChangeListener logbackChangeListener = new LogbackChangeListener(); /** * Prepares the logging. This method must be called before any logging occurs @@ -83,12 +84,13 @@ public static void initLogging(final @NotNull File configFolder) { final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - context.addListener(new LogbackChangeListener()); + context.addListener(logbackChangeListener); final boolean overridden = overrideLogbackXml(configFolder); if (!overridden) { reEnableDefaultAppenders(); + context.addTurboFilter(logLevelModifierTurboFilter); } redirectJULToSLF4J(); logQueuedEntries(); @@ -100,6 +102,12 @@ public static void initLogging(final @NotNull File configFolder) { log.trace("Added Netty log level modifier"); } + public static void resetLogging() { + final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + context.getTurboFilterList().remove(logLevelModifierTurboFilter); + context.removeListener(logbackChangeListener); + } + /** * Re-enables all default appenders that were removed from the root logger for startup */ From 6d99849dcb21e836164cd006c4efac1f06cf6af1 Mon Sep 17 00:00:00 2001 From: Remit Date: Tue, 12 Dec 2023 13:47:05 +0100 Subject: [PATCH 2/4] Logging > corrected and added logged statements about logging configuration --- .../hivemq/bootstrap/LoggingBootstrap.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java index 6e8262012..ec0c35d4c 100644 --- a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java +++ b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java @@ -86,7 +86,7 @@ public static void initLogging(final @NotNull File configFolder) { context.addListener(logbackChangeListener); - final boolean overridden = overrideLogbackXml(configFolder); + final boolean overridden = tryToOverrideLogbackXml(configFolder); if (!overridden) { reEnableDefaultAppenders(); @@ -151,15 +151,14 @@ private static void redirectJULToSLF4J() { } /** - * Overrides the standard Logging configuration delivered with HiveMQ with + * Attempts to override the standard Logging configuration delivered with HiveMQ with * a logback.xml from the config folder. * * @return If the default configuration was overridden */ - private static boolean overrideLogbackXml(final @NotNull File configFolder) { + private static boolean tryToOverrideLogbackXml(final @NotNull File configFolder) { final File file = new File(configFolder, "logback.xml"); if (file.canRead()) { - log.info("Log Configuration was overridden by {}", file.getAbsolutePath()); final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); try { context.reset(); @@ -169,23 +168,28 @@ private static boolean overrideLogbackXml(final @NotNull File configFolder) { configurator.doConfigure(file); context.getLogger(Logger.ROOT_LOGGER_NAME).addAppender(listAppender); + log.info("Log Configuration was overridden by {}", file.getAbsolutePath()); return true; } catch (final JoranException je) { - // StatusPrinter will handle this + // StatusPrinter will handle the rest + log.warn( + "A configurator exception was thrown while attempting to configure Logback. Using HiveMQ default logging configuration."); } catch (final Exception ex) { + log.warn( + "An exception was thrown while attempting to configure Logback. Using HiveMQ default logging configuration."); // Just in case, so we see a stacktrace if the logger could not be initialized ex.printStackTrace(); } finally { StatusPrinter.printInCaseOfErrorsOrWarnings(context); } // Print internal status data in case of warnings or errors. - return false; - } else { + } else { // we do not override if the custom config file does not exist log.warn( - "The logging configuration file {} does not exist. Using HiveMQ default logging configuration.", + "The logging configuration file {} cannot be read or does not exist. Using HiveMQ default logging configuration.", file.getAbsolutePath()); - return false; } + + return false; } /** From 2cd5eb5c47ab780ed95ee3d7c7057285c7ebb040 Mon Sep 17 00:00:00 2001 From: Remit Date: Tue, 12 Dec 2023 16:59:57 +0100 Subject: [PATCH 3/4] LoggingBootstrap > formatting --- .../src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java index ec0c35d4c..e318b4be9 100644 --- a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java +++ b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java @@ -87,7 +87,6 @@ public static void initLogging(final @NotNull File configFolder) { context.addListener(logbackChangeListener); final boolean overridden = tryToOverrideLogbackXml(configFolder); - if (!overridden) { reEnableDefaultAppenders(); context.addTurboFilter(logLevelModifierTurboFilter); @@ -96,7 +95,6 @@ public static void initLogging(final @NotNull File configFolder) { logQueuedEntries(); reset(); - logLevelModifierTurboFilter.registerLogLevelModifier(new NettyLogLevelModifier()); logLevelModifierTurboFilter.registerLogLevelModifier(new MiscLogLevelModifier()); log.trace("Added Netty log level modifier"); From e5129364cd40a1265ebfe8141809c0d918fc32bd Mon Sep 17 00:00:00 2001 From: Remit Date: Tue, 12 Dec 2023 17:10:09 +0100 Subject: [PATCH 4/4] LoggingBootstrap > formatting --- .../main/java/com/hivemq/bootstrap/LoggingBootstrap.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java index e318b4be9..5cadc0cfa 100644 --- a/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java +++ b/hivemq-edge/src/main/java/com/hivemq/bootstrap/LoggingBootstrap.java @@ -59,7 +59,6 @@ public static void prepareLogging() { final ch.qos.logback.classic.Logger logger = getRootLogger(); - final Iterator> iterator = logger.iteratorForAppenders(); while (iterator.hasNext()) { final Appender next = iterator.next(); @@ -68,12 +67,10 @@ public static void prepareLogging() { defaultAppenders.add(next); } - //This appender just adds entries to an Array List so we can queue the log statements for later listAppender = new ListAppender<>(); listAppender.start(); logger.addAppender(listAppender); - } /** @@ -81,7 +78,6 @@ public static void prepareLogging() { * at the very beginning of the HiveMQ lifecycle */ public static void initLogging(final @NotNull File configFolder) { - final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); context.addListener(logbackChangeListener); @@ -110,7 +106,6 @@ public static void resetLogging() { * Re-enables all default appenders that were removed from the root logger for startup */ private static void reEnableDefaultAppenders() { - final ch.qos.logback.classic.Logger logger = getRootLogger(); for (final Appender defaultAppender : defaultAppenders) { @@ -122,7 +117,6 @@ private static void reEnableDefaultAppenders() { * Logs all queued Entries to the logger. It is assumed that the logger is fully initialized at this point */ private static void logQueuedEntries() { - final ch.qos.logback.classic.Logger logger = getRootLogger(); listAppender.stop();