16
16
*/
17
17
package org .apache .logging .log4j .util ;
18
18
19
- import static org .apache .logging .log4j .LogManager .FACTORY_PROPERTY_NAME ;
20
19
import static org .apache .logging .log4j .spi .Provider .PROVIDER_PROPERTY_NAME ;
21
20
22
21
import aQute .bnd .annotation .Cardinality ;
34
33
import java .util .concurrent .locks .Lock ;
35
34
import java .util .concurrent .locks .ReentrantLock ;
36
35
import java .util .stream .Collectors ;
36
+ import org .apache .logging .log4j .LogManager ;
37
37
import org .apache .logging .log4j .Logger ;
38
- import org .apache .logging .log4j .simple .SimpleLoggerContextFactory ;
38
+ import org .apache .logging .log4j .simple .internal . SimpleProvider ;
39
39
import org .apache .logging .log4j .spi .LoggerContextFactory ;
40
- import org .apache .logging .log4j .spi .NoOpThreadContextMap ;
41
40
import org .apache .logging .log4j .spi .Provider ;
42
41
import org .apache .logging .log4j .status .StatusLogger ;
43
42
@@ -72,19 +71,17 @@ public final class ProviderUtil {
72
71
*/
73
72
static final Lock STARTUP_LOCK = new ReentrantLock ();
74
73
75
- private static final String API_VERSION = "Log4jAPIVersion" ;
76
74
private static final String [] COMPATIBLE_API_VERSIONS = {"2.6.0" };
77
75
private static final Logger LOGGER = StatusLogger .getLogger ();
78
76
79
77
private static volatile Provider PROVIDER ;
80
- private static final Provider FALLBACK_PROVIDER = new SimpleProvider ();
81
78
82
79
private ProviderUtil () {}
83
80
84
81
static void addProvider (final Provider provider ) {
85
82
if (validVersion (provider .getVersions ())) {
86
83
PROVIDERS .add (provider );
87
- LOGGER .debug ("Loaded Provider {}" , provider );
84
+ LOGGER .debug ("Loaded provider: \n {}" , provider );
88
85
} else {
89
86
LOGGER .warn ("Ignoring provider for incompatible version {}:\n {}" , provider .getVersions (), provider );
90
87
}
@@ -100,6 +97,7 @@ static void addProvider(final Provider provider) {
100
97
@ SuppressFBWarnings (
101
98
value = "URLCONNECTION_SSRF_FD" ,
102
99
justification = "Uses a fixed URL that ends in 'META-INF/log4j-provider.properties'." )
100
+ @ SuppressWarnings ("deprecation" )
103
101
static void loadProvider (final URL url , final ClassLoader cl ) {
104
102
try {
105
103
final Properties props = PropertiesUtil .loadClose (url .openStream (), url );
@@ -178,32 +176,37 @@ static void lazyInit() {
178
176
/**
179
177
* Used to test the public {@link #getProvider()} method.
180
178
*/
179
+ @ SuppressWarnings ("deprecation" )
181
180
static Provider selectProvider (
182
181
final PropertiesUtil properties , final Collection <Provider > providers , final Logger statusLogger ) {
183
182
Provider selected = null ;
184
183
// 1. Select provider using "log4j.provider" property
185
184
final String providerClass = properties .getStringProperty (PROVIDER_PROPERTY_NAME );
186
185
if (providerClass != null ) {
187
- try {
188
- selected = LoaderUtil .newInstanceOf (providerClass );
189
- } catch (final Exception e ) {
190
- statusLogger .error (
191
- "Unable to create provider {}.\n Falling back to default selection process." , PROVIDER , e );
186
+ if (SimpleProvider .class .getName ().equals (providerClass )) {
187
+ selected = new SimpleProvider ();
188
+ } else {
189
+ try {
190
+ selected = LoaderUtil .newInstanceOf (providerClass );
191
+ } catch (final Exception e ) {
192
+ statusLogger .error (
193
+ "Unable to create provider {}.\n Falling back to default selection process." , PROVIDER , e );
194
+ }
192
195
}
193
196
}
194
197
// 2. Use deprecated "log4j2.loggerContextFactory" property to choose the provider
195
- final String factoryClassName = properties .getStringProperty (FACTORY_PROPERTY_NAME );
198
+ final String factoryClassName = properties .getStringProperty (LogManager . FACTORY_PROPERTY_NAME );
196
199
if (factoryClassName != null ) {
197
200
if (selected != null ) {
198
201
statusLogger .warn (
199
202
"Ignoring {} system property, since {} was set." ,
200
- FACTORY_PROPERTY_NAME ,
203
+ LogManager . FACTORY_PROPERTY_NAME ,
201
204
PROVIDER_PROPERTY_NAME );
202
205
// 2a. Scan the known providers for one matching the logger context factory class name.
203
206
} else {
204
207
statusLogger .warn (
205
208
"Usage of the {} property is deprecated. Use the {} property instead." ,
206
- FACTORY_PROPERTY_NAME ,
209
+ LogManager . FACTORY_PROPERTY_NAME ,
207
210
PROVIDER_PROPERTY_NAME );
208
211
for (final Provider provider : providers ) {
209
212
if (factoryClassName .equals (provider .getClassName ())) {
@@ -225,14 +228,14 @@ static Provider selectProvider(
225
228
statusLogger .error (
226
229
"Class {} specified in the {} system property does not extend {}" ,
227
230
factoryClassName ,
228
- FACTORY_PROPERTY_NAME ,
231
+ LogManager . FACTORY_PROPERTY_NAME ,
229
232
LoggerContextFactory .class .getName ());
230
233
}
231
234
} catch (final Exception e ) {
232
235
statusLogger .error (
233
236
"Unable to create class {} specified in the {} system property" ,
234
237
factoryClassName ,
235
- FACTORY_PROPERTY_NAME ,
238
+ LogManager . FACTORY_PROPERTY_NAME ,
236
239
e );
237
240
}
238
241
}
@@ -253,7 +256,7 @@ static Provider selectProvider(
253
256
.collect (Collectors .joining ("\n " , "Log4j API found multiple logging providers:\n " , "" )));
254
257
break ;
255
258
}
256
- selected = providers .stream ().max (comparator ).orElse ( FALLBACK_PROVIDER );
259
+ selected = providers .stream ().max (comparator ).orElseGet ( SimpleProvider :: new );
257
260
}
258
261
statusLogger .info ("Using provider:\n {}" , selected );
259
262
return selected ;
@@ -271,10 +274,4 @@ private static boolean validVersion(final String version) {
271
274
}
272
275
return false ;
273
276
}
274
-
275
- private static final class SimpleProvider extends Provider {
276
- private SimpleProvider () {
277
- super (null , CURRENT_VERSION , SimpleLoggerContextFactory .class , NoOpThreadContextMap .class );
278
- }
279
- }
280
277
}
0 commit comments