Skip to content

Commit 852b2d9

Browse files
SNOW-1652680: Add option to override j.u.l.ConsoleHandler to write to stdout (#1981)
1 parent 4faff34 commit 852b2d9

File tree

5 files changed

+98
-1
lines changed

5 files changed

+98
-1
lines changed

src/main/java/net/snowflake/client/core/SFSession.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import net.snowflake.client.jdbc.telemetry.Telemetry;
4747
import net.snowflake.client.jdbc.telemetry.TelemetryClient;
4848
import net.snowflake.client.jdbc.telemetryOOB.TelemetryService;
49+
import net.snowflake.client.log.JDK14Logger;
4950
import net.snowflake.client.log.SFLogger;
5051
import net.snowflake.client.log.SFLoggerFactory;
5152
import net.snowflake.client.log.SFLoggerUtil;
@@ -435,6 +436,11 @@ public void addSFSessionProperty(String propertyName, Object propertyValue) thro
435436
tracingLevel = Level.parse(((String) propertyValue).toUpperCase());
436437
}
437438
break;
439+
case JAVA_LOGGING_CONSOLE_STD_OUT:
440+
if (propertyValue != null && (Boolean) propertyValue) {
441+
JDK14Logger.useStdOutConsoleHandler();
442+
}
443+
break;
438444

439445
case DISABLE_SOCKS_PROXY:
440446
// note: if any session has this parameter, it will be used for all

src/main/java/net/snowflake/client/core/SFSessionProperty.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ public enum SFSessionProperty {
112112

113113
HTTP_CLIENT_CONNECTION_TIMEOUT("HTTP_CLIENT_CONNECTION_TIMEOUT", false, Integer.class),
114114

115-
HTTP_CLIENT_SOCKET_TIMEOUT("HTTP_CLIENT_SOCKET_TIMEOUT", false, Integer.class);
115+
HTTP_CLIENT_SOCKET_TIMEOUT("HTTP_CLIENT_SOCKET_TIMEOUT", false, Integer.class),
116+
117+
JAVA_LOGGING_CONSOLE_STD_OUT("JAVA_LOGGING_CONSOLE_STD_OUT", false, Boolean.class);
116118

117119
// property key in string
118120
private String propertyKey;

src/main/java/net/snowflake/client/log/JDK14Logger.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import java.util.logging.SimpleFormatter;
1919
import net.snowflake.client.core.EventHandler;
2020
import net.snowflake.client.core.EventUtil;
21+
import net.snowflake.client.core.SFSessionProperty;
22+
import net.snowflake.client.core.SnowflakeJdbcInternalApi;
2123
import net.snowflake.client.util.SecretDetector;
2224

2325
/**
@@ -38,10 +40,32 @@ public class JDK14Logger implements SFLogger {
3840

3941
public static String STDOUT = "STDOUT";
4042

43+
private static final StdOutConsoleHandler STD_OUT_CONSOLE_HANDLER = new StdOutConsoleHandler();
44+
4145
public JDK14Logger(String name) {
4246
this.jdkLogger = Logger.getLogger(name);
4347
}
4448

49+
static {
50+
String javaLoggingConsoleStdOut =
51+
System.getProperty(SFSessionProperty.JAVA_LOGGING_CONSOLE_STD_OUT.getPropertyKey());
52+
if ("true".equalsIgnoreCase(javaLoggingConsoleStdOut)) {
53+
useStdOutConsoleHandler();
54+
}
55+
}
56+
57+
@SnowflakeJdbcInternalApi
58+
public static void useStdOutConsoleHandler() {
59+
Logger rootLogger = Logger.getLogger("");
60+
for (Handler handler : rootLogger.getHandlers()) {
61+
if (handler instanceof ConsoleHandler) {
62+
rootLogger.removeHandler(handler);
63+
rootLogger.addHandler(STD_OUT_CONSOLE_HANDLER);
64+
break;
65+
}
66+
}
67+
}
68+
4569
public boolean isDebugEnabled() {
4670
return this.jdkLogger.isLoggable(Level.FINE);
4771
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright (c) 2012-2019 Snowflake Computing Inc. All rights reserved.
3+
*/
4+
package net.snowflake.client.log;
5+
6+
import java.util.logging.LogRecord;
7+
import java.util.logging.SimpleFormatter;
8+
import java.util.logging.StreamHandler;
9+
10+
class StdOutConsoleHandler extends StreamHandler {
11+
public StdOutConsoleHandler() {
12+
// configure with specific defaults for ConsoleHandler
13+
super(System.out, new SimpleFormatter());
14+
}
15+
16+
@Override
17+
public void publish(LogRecord record) {
18+
super.publish(record);
19+
flush();
20+
}
21+
22+
@Override
23+
public void close() {
24+
flush();
25+
}
26+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
3+
*/
4+
package net.snowflake.client.log;
5+
6+
import static org.junit.jupiter.api.Assertions.assertFalse;
7+
import static org.junit.jupiter.api.Assertions.assertTrue;
8+
9+
import java.sql.Connection;
10+
import java.sql.ResultSet;
11+
import java.sql.Statement;
12+
import java.util.Arrays;
13+
import java.util.Properties;
14+
import java.util.logging.ConsoleHandler;
15+
import java.util.logging.Handler;
16+
import java.util.logging.Logger;
17+
import net.snowflake.client.category.TestTags;
18+
import net.snowflake.client.jdbc.BaseJDBCTest;
19+
import org.junit.jupiter.api.Tag;
20+
import org.junit.jupiter.api.Test;
21+
22+
@Tag(TestTags.CORE)
23+
public class JDK14LoggerConsoleHandlerOverrideLatestIT extends BaseJDBCTest {
24+
/** Added in > 3.20.0 */
25+
@Test
26+
public void shouldOverrideConsoleLogger() throws Exception {
27+
Properties paramProperties = new Properties();
28+
paramProperties.put("JAVA_LOGGING_CONSOLE_STD_OUT", true);
29+
try (Connection connection = getConnection(paramProperties);
30+
Statement statement = connection.createStatement();
31+
ResultSet resultSet = statement.executeQuery("select 1")) {
32+
assertTrue(resultSet.next());
33+
Handler[] handlers = Logger.getLogger("").getHandlers();
34+
assertTrue(handlers.length > 0);
35+
assertFalse(Arrays.stream(handlers).anyMatch(h -> h instanceof ConsoleHandler));
36+
assertTrue(Arrays.stream(handlers).anyMatch(h -> h instanceof StdOutConsoleHandler));
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)