diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 1c7012ea9..8c15218e7 100644 --- a/NEXT_CHANGELOG.md +++ b/NEXT_CHANGELOG.md @@ -12,6 +12,7 @@ ### Fixed - Fix driver crash when using `INTERVAL` types. +- Fix connection failure in restricted environments when `LogLevel.OFF` is used. --- *Note: When making changes, please add your change under the appropriate section with a brief description.* diff --git a/src/main/java/com/databricks/jdbc/common/util/LoggingUtil.java b/src/main/java/com/databricks/jdbc/common/util/LoggingUtil.java index 3187d0f35..c73994e6c 100644 --- a/src/main/java/com/databricks/jdbc/common/util/LoggingUtil.java +++ b/src/main/java/com/databricks/jdbc/common/util/LoggingUtil.java @@ -17,6 +17,10 @@ public class LoggingUtil { public static void setupLogger(String logDir, int logFileSizeMB, int logFileCount, LogLevel level) throws IOException { + if (level == LogLevel.OFF) { + // Skip handler initialization to avoid AccessDeniedException in restricted environments + return; + } if (LOGGER instanceof JulLogger && System.getProperty(JAVA_UTIL_LOGGING_CONFIG_FILE) == null) { // Only configure JUL logger if it's not already configured via external properties file JulLogger.initLogger(toJulLevel(level), logDir, logFileSizeMB * 1024 * 1024, logFileCount); diff --git a/src/test/java/com/databricks/jdbc/common/util/LoggingUtilTest.java b/src/test/java/com/databricks/jdbc/common/util/LoggingUtilTest.java index a534489ef..8b308e822 100644 --- a/src/test/java/com/databricks/jdbc/common/util/LoggingUtilTest.java +++ b/src/test/java/com/databricks/jdbc/common/util/LoggingUtilTest.java @@ -18,6 +18,14 @@ void testSetupLogger() { assertDoesNotThrow(() -> LoggingUtil.setupLogger("test.log", 1, 1, LogLevel.DEBUG)); } + @Test + void testSetupLoggerWithOffLevel() { + // When log level is OFF, setupLogger should return early without initializing handlers + // This should not throw an exception even if the log path is not writable + assertDoesNotThrow(() -> LoggingUtil.setupLogger("/", 1, 1, LogLevel.OFF)); + assertDoesNotThrow(() -> LoggingUtil.setupLogger("/invalid/path", 1, 1, LogLevel.OFF)); + } + @ParameterizedTest @MethodSource("logLevelToJulLevelProvider") void testToJulLevel(LogLevel input, Level expected) { @@ -32,6 +40,7 @@ static Stream logLevelToJulLevelProvider() { org.junit.jupiter.params.provider.Arguments.of(LogLevel.FATAL, Level.SEVERE), org.junit.jupiter.params.provider.Arguments.of(LogLevel.INFO, Level.INFO), org.junit.jupiter.params.provider.Arguments.of(LogLevel.TRACE, Level.FINEST), - org.junit.jupiter.params.provider.Arguments.of(LogLevel.WARN, Level.WARNING)); + org.junit.jupiter.params.provider.Arguments.of(LogLevel.WARN, Level.WARNING), + org.junit.jupiter.params.provider.Arguments.of(LogLevel.OFF, Level.OFF)); } }