Skip to content

Commit 99d0f0c

Browse files
authored
test: add slf4j and logback config for tests (#2946)
1 parent 9af146d commit 99d0f0c

File tree

3 files changed

+130
-0
lines changed

3 files changed

+130
-0
lines changed

google-cloud-storage/pom.xml

+28
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,18 @@
334334
<version>4.8.179</version>
335335
<scope>test</scope>
336336
</dependency>
337+
<dependency>
338+
<groupId>org.slf4j</groupId>
339+
<artifactId>jul-to-slf4j</artifactId>
340+
<version>2.0.16</version>
341+
<scope>test</scope>
342+
</dependency>
343+
<dependency>
344+
<groupId>ch.qos.logback</groupId>
345+
<artifactId>logback-classic</artifactId>
346+
<version>1.3.15</version>
347+
<scope>test</scope>
348+
</dependency>
337349
</dependencies>
338350

339351
<build>
@@ -386,6 +398,22 @@
386398
-->
387399
<dependency>io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi</dependency>
388400
<dependency>io.opentelemetry.semconv:opentelemetry-semconv</dependency>
401+
<!--
402+
com.google.cloud.opentelemetry:exporter-metrics depends on slf4j
403+
We are also using slf4j and logback in our test scope
404+
list things out here to appease the dependency checker that gets confused like the following
405+
406+
[ERROR] Used undeclared dependencies found:
407+
[ERROR] org.slf4j:slf4j-api:jar:2.0.16:compile
408+
[ERROR] Unused declared dependencies found:
409+
[ERROR] org.slf4j:jul-to-slf4j:jar:2.0.16:test
410+
[ERROR] ch.qos.logback:logback-classic:jar:1.3.15:test
411+
[ERROR] Non-test scoped test only dependencies found:
412+
[ERROR] org.slf4j:slf4j-api:jar:2.0.16:compile
413+
-->
414+
<dependency>org.slf4j:slf4j-api</dependency>
415+
<dependency>org.slf4j:jul-to-slf4j</dependency>
416+
<dependency>ch.qos.logback:logback-classic</dependency>
389417
</ignoredDependencies>
390418
</configuration>
391419
</plugin>

google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITRunner.java

+9
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
import org.junit.runners.model.FrameworkField;
4343
import org.junit.runners.model.InitializationError;
4444
import org.junit.runners.model.TestClass;
45+
import org.slf4j.Logger;
46+
import org.slf4j.LoggerFactory;
4547

4648
/**
4749
* Storage custom runner which will handle {@link CrossRun}, {@link SingleBackend}, {@link
@@ -53,6 +55,12 @@
5355
* @see org.junit.runners.BlockJUnit4ClassRunner
5456
*/
5557
public final class StorageITRunner extends Suite {
58+
static {
59+
org.slf4j.bridge.SLF4JBridgeHandler.removeHandlersForRootLogger();
60+
org.slf4j.bridge.SLF4JBridgeHandler.install();
61+
}
62+
63+
private static final Logger LOGGER = LoggerFactory.getLogger(StorageITRunner.class);
5664

5765
private final Lock childrenLock = new ReentrantLock();
5866
private volatile ImmutableList<Runner> filteredChildren = null;
@@ -67,6 +75,7 @@ public StorageITRunner(Class<?> klass) throws InitializationError {
6775

6876
@Override
6977
public void run(RunNotifier notifier) {
78+
LOGGER.debug("run(notifier : {})", notifier);
7079
super.run(new RunNotifierUnion(notifier, Registry.getInstance()));
7180
}
7281

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<!--
2+
~ Copyright 2025 Google LLC
3+
~
4+
~ Licensed under the Apache License, Version 2.0 (the "License");
5+
~ you may not use this file except in compliance with the License.
6+
~ You may obtain a copy of the License at
7+
~
8+
~ http://www.apache.org/licenses/LICENSE-2.0
9+
~
10+
~ Unless required by applicable law or agreed to in writing, software
11+
~ distributed under the License is distributed on an "AS IS" BASIS,
12+
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
~ See the License for the specific language governing permissions and
14+
~ limitations under the License.
15+
-->
16+
17+
<configuration>
18+
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
19+
<resetJUL>true</resetJUL>
20+
</contextListener>
21+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
22+
<encoder>
23+
<pattern>%date %-5.5level [%-24.24thread] %-45.45logger{45} - %message%n</pattern>
24+
</encoder>
25+
</appender>
26+
<appender name="NOEXCEPTION" class="ch.qos.logback.core.ConsoleAppender">
27+
<encoder>
28+
<pattern>%date %-5.5level [%-24.24thread] %-45.45logger{45} - %message%nopex%n</pattern>
29+
</encoder>
30+
</appender>
31+
<logger name="com.google.auth.oauth2.ComputeEngineCredentials" level="info"/>
32+
<logger name="io.opencensus" level="info"/>
33+
<logger name="io.grpc.ChannelLogger" level="info"/>
34+
<!-- Context logs an exception when it's not able to find things, so suppress it's exception -->
35+
<logger name="io.grpc.Context" level="info" additivity="false">
36+
<appender-ref ref="NOEXCEPTION"/>
37+
</logger>
38+
<logger name="io.grpc.LoadBalancerRegistry" level="warn"/>
39+
<logger name="io.grpc.NameResolverRegistry" level="warn"/>
40+
<!--
41+
GrpclbNameResolver logs an exception with several of it's messages that aren't
42+
useful when you're only interested in the traffic
43+
-->
44+
<logger name="io.grpc.grpclb.GrpclbNameResolver" level="info" additivity="false">
45+
<appender-ref ref="NOEXCEPTION"/>
46+
</logger>
47+
<logger name="io.grpc.ManagedChannelRegistry" level="info" additivity="false">
48+
<appender-ref ref="NOEXCEPTION"/>
49+
</logger>
50+
<logger name="io.grpc.internal.ManagedChannelImplBuilder" level="info" additivity="false">
51+
<appender-ref ref="NOEXCEPTION"/>
52+
</logger>
53+
<logger name="io.grpc.internal.AbstractManagedChannelImplBuilder" level="warn"/>
54+
<logger name="io.grpc.internal.DnsNameResolver" level="warn"/>
55+
<!--
56+
netty initialization and event loop management appenders,
57+
not necessarily what is desired when debugging requests
58+
-->
59+
<logger name="io.grpc.netty.shaded.io.grpc.netty" level="warn"/>
60+
<logger name="io.grpc.netty.shaded.io.netty" level="warn"/>
61+
<logger name="io.grpc.netty.shaded.io.netty.buffer" level="warn"/>
62+
<logger name="io.grpc.netty.shaded.io.netty.channel.DefaultChannelId" level="warn"/>
63+
<logger name="io.grpc.netty.shaded.io.netty.channel.MultithreadEventLoopGroup" level="warn"/>
64+
<logger name="io.grpc.netty.shaded.io.netty.handler.ssl" level="warn"/>
65+
<logger name="io.grpc.netty.shaded.io.netty.util.NetUtil" level="warn"/>
66+
<logger name="io.grpc.netty.shaded.io.netty.util.Recycler" level="warn"/>
67+
<logger name="io.grpc.netty.shaded.io.netty.util.ResourceLeakDetector" level="warn"/>
68+
<logger name="io.grpc.netty.shaded.io.netty.util.ResourceLeakDetectorFactory" level="warn"/>
69+
<logger name="io.grpc.netty.shaded.io.netty.util.internal.CleanerJava6" level="warn"/>
70+
<logger name="io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap" level="warn"/>
71+
<logger name="io.grpc.netty.shaded.io.netty.util.internal.NativeLibraryLoader" level="warn"/>
72+
<logger name="io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent" level="warn"/>
73+
<logger name="io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0" level="warn"/>
74+
<logger name="io.perfmark.PerfMark" level="warn"/>
75+
<!--
76+
jdk11 appender which includes lots of details about ssl cypher suites
77+
-->
78+
<logger name="jdk.event.security" level="warn"/>
79+
<!-- http request logging -->
80+
<logger name="sun.net.www.protocol.http.HttpURLConnection" level="warn"/>
81+
<logger name="com.google.api.client.http.HttpTransport" level="debug"/>
82+
<logger name="com.google.cloud.storage.it.GrpcPlainRequestLoggingInterceptor" level="trace"/>
83+
<!-- grpc netty traffic logging -->
84+
<!--<logger name="io.grpc.netty.shaded.io.netty.handler.ssl.SslHandler" level="debug"/>-->
85+
<!--<logger name="io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler" level="debug"/>-->
86+
87+
<logger name="com.google.cloud.storage" level="info"/>
88+
<logger name="com.google.cloud.storage.it" level="warn"/>
89+
90+
<root level="info">
91+
<appender-ref ref="STDOUT"/>
92+
</root>
93+
</configuration>

0 commit comments

Comments
 (0)