Skip to content

Commit

Permalink
Merge pull request #188 from hivemq/improvement/register-turbofilter-…
Browse files Browse the repository at this point in the history
…only-once

Register LogLevelModifierTurboFilter only once.
  • Loading branch information
A-Imal authored Dec 13, 2023
2 parents 0d55dde + e512936 commit 2ae3cd7
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 18 deletions.
2 changes: 2 additions & 0 deletions hivemq-edge/src/main/java/com/hivemq/HiveMQEdgeMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ protected void stopGateway() {

//Stop the API Webserver
stopApiServer();

LoggingBootstrap.resetLogging();
}

protected void initializeApiServer(@NotNull final Injector injector) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public class LoggingBootstrap {
private static final List<Appender<ILoggingEvent>> 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
Expand All @@ -58,7 +59,6 @@ public static void prepareLogging() {

final ch.qos.logback.classic.Logger logger = getRootLogger();


final Iterator<Appender<ILoggingEvent>> iterator = logger.iteratorForAppenders();
while (iterator.hasNext()) {
final Appender<ILoggingEvent> next = iterator.next();
Expand All @@ -67,44 +67,45 @@ 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);

}

/**
* Initializes all Logging for HiveMQ. Call this method only once
* at the very beginning of the HiveMQ lifecycle
*/
public static void initLogging(final @NotNull File configFolder) {

final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

context.addListener(new LogbackChangeListener());

final boolean overridden = overrideLogbackXml(configFolder);
context.addListener(logbackChangeListener);

final boolean overridden = tryToOverrideLogbackXml(configFolder);
if (!overridden) {
reEnableDefaultAppenders();
context.addTurboFilter(logLevelModifierTurboFilter);
}
redirectJULToSLF4J();
logQueuedEntries();

reset();

logLevelModifierTurboFilter.registerLogLevelModifier(new NettyLogLevelModifier());
logLevelModifierTurboFilter.registerLogLevelModifier(new MiscLogLevelModifier());
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
*/
private static void reEnableDefaultAppenders() {

final ch.qos.logback.classic.Logger logger = getRootLogger();

for (final Appender<ILoggingEvent> defaultAppender : defaultAppenders) {
Expand All @@ -116,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();
Expand All @@ -143,15 +143,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();
Expand All @@ -161,23 +160,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;
}

/**
Expand Down

0 comments on commit 2ae3cd7

Please sign in to comment.