From b4a0713b6dc7f497bfb5afc75cb26d12ba895d1a Mon Sep 17 00:00:00 2001 From: Michael Mendy Date: Thu, 4 Jun 2026 17:17:02 -0700 Subject: [PATCH 1/4] fix(logback): restrict recursive logger suppression to Rollbar package --- .../com/rollbar/logback/RollbarAppender.java | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java index 571bd335..831662ed 100644 --- a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java +++ b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java @@ -37,7 +37,6 @@ public class RollbarAppender extends AppenderBase { private static final String CUSTOM_ARGUMENT_ARRAY_KEY = "argumentArray"; - private Rollbar rollbar; private String accessToken; @@ -61,7 +60,7 @@ public class RollbarAppender extends AppenderBase { private String configProviderClassName; /** - * Constructor for programmatic instantiation using an existing Rollbar instance. + * vonstructor for programmatic instantiation using an existing Rollbar instance. * * @param rollbar the rollbar notifier. */ @@ -70,32 +69,31 @@ public RollbarAppender(Rollbar rollbar) { } public RollbarAppender() { - //empty constructor + // empty constructor } @Override public void start() { if (this.rollbar == null) { ConfigProvider configProvider = ConfigProviderHelper - .getConfigProvider(this.configProviderClassName); + .getConfigProvider(this.configProviderClassName); Config config; ConfigBuilder configBuilder = withAccessToken(this.accessToken) - .environment(this.environment) - .endpoint(this.endpoint) - .server(new ServerProvider()) - .language(this.language) - .codeVersion(this.codeVersion) - .context(new Provider() { - @Override - public String provide() { - return RollbarAppender.this.staticContext; - } - }) - .enabled(this.enabled) - .framework(this.framework) - .platform(this.platform) - ; + .environment(this.environment) + .endpoint(this.endpoint) + .server(new ServerProvider()) + .language(this.language) + .codeVersion(this.codeVersion) + .context(new Provider() { + @Override + public String provide() { + return RollbarAppender.this.staticContext; + } + }) + .enabled(this.enabled) + .framework(this.framework) + .platform(this.platform); if (configProvider != null) { config = configProvider.provide(configBuilder); @@ -105,12 +103,13 @@ public String provide() { this.rollbar = new Rollbar(config); } + super.start(); } @Override protected void append(ILoggingEvent event) { - if (event.getLoggerName() != null && event.getLoggerName().startsWith(PACKAGE_NAME)) { + if (isRollbarLogger(event.getLoggerName())) { addWarn("Recursive logging"); return; } @@ -119,14 +118,27 @@ protected void append(ILoggingEvent event) { ThrowableWrapper rollbarThrowableWrapper = buildRollbarThrowableWrapper(throwableProxy); Map custom = this.buildCustom(event); - rollbar.log(rollbarThrowableWrapper, custom, event.getFormattedMessage(), - Level.lookupByName(event.getLevel().levelStr), false); + rollbar.log( + rollbarThrowableWrapper, + custom, + event.getFormattedMessage(), + Level.lookupByName(event.getLevel().levelStr), + false); + } + + private static boolean isRollbarLogger(String loggerName) { + if (loggerName == null) { + return false; + } + return PACKAGE_NAME.equals(loggerName) + || loggerName.startsWith(PACKAGE_NAME + "."); } @Override public void stop() { super.stop(); + try { rollbar.close(true); } catch (Exception e) { @@ -195,11 +207,15 @@ private ThrowableWrapper buildRollbarThrowableWrapper(IThrowableProxy throwableP StackTraceElement[] stackTraceElements = buildStackTraceElements( throwableProxy.getStackTraceElementProxyArray()); - return new RollbarThrowableWrapper(className, message, stackTraceElements, + return new RollbarThrowableWrapper( + className, + message, + stackTraceElements, causeThrowableWrapper); } - private StackTraceElement[] buildStackTraceElements(StackTraceElementProxy[] stackTraceElements) { + private StackTraceElement[] buildStackTraceElements( + StackTraceElementProxy[] stackTraceElements) { StackTraceElement[] elements = new StackTraceElement[stackTraceElements.length]; for (int i = 0; i < stackTraceElements.length; i++) { @@ -214,10 +230,8 @@ private Map buildCustom(ILoggingEvent event) { custom.put(CUSTOM_LOGGER_NAME_KEY, event.getLoggerName()); custom.put(CUSTOM_THREAD_NAME_KEY, event.getThreadName()); - custom.put(CUSTOM_MDC_NAME_KEY, this.buildMdc(event)); custom.put(CUSTOM_MAKER_NAME_KEY, this.getMarker(event)); - custom.put(CUSTOM_ARGUMENT_ARRAY_KEY, event.getArgumentArray()); Map rootCustom = new HashMap<>(); @@ -230,7 +244,7 @@ private Map buildMdc(ILoggingEvent event) { if (event.getMDCPropertyMap() == null || event.getMDCPropertyMap().size() == 0) { return null; } - + Map custom = new HashMap<>(); for (Entry mdcEntry : event.getMDCPropertyMap().entrySet()) { From b1fb25d3a5d465aa49e2d1111c708ba298799c46 Mon Sep 17 00:00:00 2001 From: Michael Mendy Date: Thu, 4 Jun 2026 17:21:31 -0700 Subject: [PATCH 2/4] fix(logback): restrict recursive logger suppression to Rollbar package --- .../com/rollbar/logback/RollbarAppender.java | 59 +++++++++---------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java index 831662ed..edad7307 100644 --- a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java +++ b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java @@ -37,6 +37,7 @@ public class RollbarAppender extends AppenderBase { private static final String CUSTOM_ARGUMENT_ARRAY_KEY = "argumentArray"; + private Rollbar rollbar; private String accessToken; @@ -60,7 +61,7 @@ public class RollbarAppender extends AppenderBase { private String configProviderClassName; /** - * vonstructor for programmatic instantiation using an existing Rollbar instance. + * Constructor for programmatic instantiation using an existing Rollbar instance. * * @param rollbar the rollbar notifier. */ @@ -69,31 +70,32 @@ public RollbarAppender(Rollbar rollbar) { } public RollbarAppender() { - // empty constructor + //empty constructor } @Override public void start() { if (this.rollbar == null) { ConfigProvider configProvider = ConfigProviderHelper - .getConfigProvider(this.configProviderClassName); + .getConfigProvider(this.configProviderClassName); Config config; ConfigBuilder configBuilder = withAccessToken(this.accessToken) - .environment(this.environment) - .endpoint(this.endpoint) - .server(new ServerProvider()) - .language(this.language) - .codeVersion(this.codeVersion) - .context(new Provider() { - @Override - public String provide() { - return RollbarAppender.this.staticContext; - } - }) - .enabled(this.enabled) - .framework(this.framework) - .platform(this.platform); + .environment(this.environment) + .endpoint(this.endpoint) + .server(new ServerProvider()) + .language(this.language) + .codeVersion(this.codeVersion) + .context(new Provider() { + @Override + public String provide() { + return RollbarAppender.this.staticContext; + } + }) + .enabled(this.enabled) + .framework(this.framework) + .platform(this.platform) + ; if (configProvider != null) { config = configProvider.provide(configBuilder); @@ -103,7 +105,6 @@ public String provide() { this.rollbar = new Rollbar(config); } - super.start(); } @@ -118,12 +119,9 @@ protected void append(ILoggingEvent event) { ThrowableWrapper rollbarThrowableWrapper = buildRollbarThrowableWrapper(throwableProxy); Map custom = this.buildCustom(event); - rollbar.log( - rollbarThrowableWrapper, - custom, - event.getFormattedMessage(), - Level.lookupByName(event.getLevel().levelStr), - false); + rollbar.log(rollbarThrowableWrapper, custom, event.getFormattedMessage(), + Level.lookupByName(event.getLevel().levelStr), false); + } private static boolean isRollbarLogger(String loggerName) { @@ -138,7 +136,6 @@ private static boolean isRollbarLogger(String loggerName) { @Override public void stop() { super.stop(); - try { rollbar.close(true); } catch (Exception e) { @@ -207,15 +204,11 @@ private ThrowableWrapper buildRollbarThrowableWrapper(IThrowableProxy throwableP StackTraceElement[] stackTraceElements = buildStackTraceElements( throwableProxy.getStackTraceElementProxyArray()); - return new RollbarThrowableWrapper( - className, - message, - stackTraceElements, + return new RollbarThrowableWrapper(className, message, stackTraceElements, causeThrowableWrapper); } - private StackTraceElement[] buildStackTraceElements( - StackTraceElementProxy[] stackTraceElements) { + private StackTraceElement[] buildStackTraceElements(StackTraceElementProxy[] stackTraceElements) { StackTraceElement[] elements = new StackTraceElement[stackTraceElements.length]; for (int i = 0; i < stackTraceElements.length; i++) { @@ -230,8 +223,10 @@ private Map buildCustom(ILoggingEvent event) { custom.put(CUSTOM_LOGGER_NAME_KEY, event.getLoggerName()); custom.put(CUSTOM_THREAD_NAME_KEY, event.getThreadName()); + custom.put(CUSTOM_MDC_NAME_KEY, this.buildMdc(event)); custom.put(CUSTOM_MAKER_NAME_KEY, this.getMarker(event)); + custom.put(CUSTOM_ARGUMENT_ARRAY_KEY, event.getArgumentArray()); Map rootCustom = new HashMap<>(); @@ -244,7 +239,7 @@ private Map buildMdc(ILoggingEvent event) { if (event.getMDCPropertyMap() == null || event.getMDCPropertyMap().size() == 0) { return null; } - + Map custom = new HashMap<>(); for (Entry mdcEntry : event.getMDCPropertyMap().entrySet()) { From 292626df376af7c2a0b0b8270fc6a2c41ca2fdb3 Mon Sep 17 00:00:00 2001 From: Michael Mendy Date: Thu, 4 Jun 2026 17:26:18 -0700 Subject: [PATCH 3/4] fix(logback): remove hidden Unicode characters --- .../com/rollbar/logback/RollbarAppender.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java index edad7307..7a11d016 100644 --- a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java +++ b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java @@ -108,12 +108,12 @@ public String provide() { super.start(); } - @Override - protected void append(ILoggingEvent event) { - if (isRollbarLogger(event.getLoggerName())) { - addWarn("Recursive logging"); - return; - } +@Override +protected void append(ILoggingEvent event) { + if (isRollbarLogger(event.getLoggerName())) { + addWarn("Recursive logging"); + return; + } IThrowableProxy throwableProxy = event.getThrowableProxy(); ThrowableWrapper rollbarThrowableWrapper = buildRollbarThrowableWrapper(throwableProxy); @@ -124,10 +124,14 @@ protected void append(ILoggingEvent event) { } - private static boolean isRollbarLogger(String loggerName) { - if (loggerName == null) { - return false; - } + private static boolean isRollbarLogger(String loggerName) { + if (loggerName == null) { + return false; + } + + return PACKAGE_NAME.equals(loggerName) + || loggerName.startsWith(PACKAGE_NAME + "."); +} return PACKAGE_NAME.equals(loggerName) || loggerName.startsWith(PACKAGE_NAME + "."); From 0c4d562341600660871993d758f827155ea055ad Mon Sep 17 00:00:00 2001 From: Michael Mendy Date: Thu, 4 Jun 2026 17:28:10 -0700 Subject: [PATCH 4/4] fix(logback): remove duplicate logger boundary check block --- .../com/rollbar/logback/RollbarAppender.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java index 7a11d016..edad7307 100644 --- a/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java +++ b/rollbar-logback/src/main/java/com/rollbar/logback/RollbarAppender.java @@ -108,12 +108,12 @@ public String provide() { super.start(); } -@Override -protected void append(ILoggingEvent event) { - if (isRollbarLogger(event.getLoggerName())) { - addWarn("Recursive logging"); - return; - } + @Override + protected void append(ILoggingEvent event) { + if (isRollbarLogger(event.getLoggerName())) { + addWarn("Recursive logging"); + return; + } IThrowableProxy throwableProxy = event.getThrowableProxy(); ThrowableWrapper rollbarThrowableWrapper = buildRollbarThrowableWrapper(throwableProxy); @@ -124,14 +124,10 @@ protected void append(ILoggingEvent event) { } - private static boolean isRollbarLogger(String loggerName) { - if (loggerName == null) { - return false; - } - - return PACKAGE_NAME.equals(loggerName) - || loggerName.startsWith(PACKAGE_NAME + "."); -} + private static boolean isRollbarLogger(String loggerName) { + if (loggerName == null) { + return false; + } return PACKAGE_NAME.equals(loggerName) || loggerName.startsWith(PACKAGE_NAME + ".");