Skip to content

Commit 5286785

Browse files
rgoersphilwebb
authored andcommitted
Resolve URLs using Log4j2 mechanisms
Update `Log4J2LoggingSystem` to that non file URLs are resolved using Log4j2's `UrlConnectionFactory` mechanism rather than directly. See gh-32735
1 parent 01003b9 commit 5286785

File tree

1 file changed

+45
-12
lines changed

1 file changed

+45
-12
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java

+45-12
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616

1717
package org.springframework.boot.logging.log4j2;
1818

19+
import java.io.File;
20+
import java.io.FileNotFoundException;
1921
import java.io.IOException;
20-
import java.io.InputStream;
22+
import java.net.URISyntaxException;
2123
import java.net.URL;
24+
import java.net.URLConnection;
2225
import java.util.ArrayList;
2326
import java.util.Collections;
2427
import java.util.LinkedHashMap;
@@ -43,9 +46,15 @@
4346
import org.apache.logging.log4j.core.config.LoggerConfig;
4447
import org.apache.logging.log4j.core.config.composite.CompositeConfiguration;
4548
import org.apache.logging.log4j.core.filter.AbstractFilter;
49+
import org.apache.logging.log4j.core.net.UrlConnectionFactory;
50+
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
51+
import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory;
52+
import org.apache.logging.log4j.core.util.AuthorizationProvider;
53+
import org.apache.logging.log4j.core.util.FileUtils;
4654
import org.apache.logging.log4j.core.util.NameUtil;
4755
import org.apache.logging.log4j.jul.Log4jBridgeHandler;
4856
import org.apache.logging.log4j.message.Message;
57+
import org.apache.logging.log4j.status.StatusLogger;
4958
import org.apache.logging.log4j.util.PropertiesUtil;
5059

5160
import org.springframework.boot.context.properties.bind.BindResult;
@@ -82,13 +91,17 @@ public class Log4J2LoggingSystem extends AbstractLoggingSystem {
8291

8392
private static final String FILE_PROTOCOL = "file";
8493

94+
private static final String HTTPS = "https";
95+
8596
private static final String LOG4J_BRIDGE_HANDLER = "org.apache.logging.log4j.jul.Log4jBridgeHandler";
8697

8798
private static final String LOG4J_LOG_MANAGER = "org.apache.logging.log4j.jul.LogManager";
8899

89100
static final String ENVIRONMENT_KEY = Conventions.getQualifiedAttributeName(Log4J2LoggingSystem.class,
90101
"environment");
91102

103+
private static org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger();
104+
92105
private static final LogLevels<Level> LEVELS = new LogLevels<>();
93106

94107
static {
@@ -280,11 +293,20 @@ protected void loadConfiguration(String location, LogFile logFile, List<String>
280293
try {
281294
List<Configuration> configurations = new ArrayList<>();
282295
LoggerContext context = getLoggerContext();
283-
configurations.add(load(location, context));
296+
Configuration configuration = load(location, context);
297+
if (configuration != null) {
298+
configurations.add(load(location, context));
299+
}
300+
else {
301+
throw new FileNotFoundException("Cannot locate file: " + location);
302+
}
284303
for (String override : overrides) {
285-
configurations.add(load(override, context));
304+
configuration = load(override, context);
305+
if (configuration != null) {
306+
configurations.add(configuration);
307+
}
286308
}
287-
Configuration configuration = (configurations.size() > 1) ? createComposite(configurations)
309+
configuration = (configurations.size() > 1) ? createComposite(configurations)
288310
: configurations.iterator().next();
289311
context.start(configuration);
290312
}
@@ -293,18 +315,29 @@ protected void loadConfiguration(String location, LogFile logFile, List<String>
293315
}
294316
}
295317

296-
private Configuration load(String location, LoggerContext context) throws IOException {
318+
private Configuration load(String location, LoggerContext context) throws IOException, URISyntaxException {
297319
URL url = ResourceUtils.getURL(location);
298320
ConfigurationSource source = getConfigurationSource(url);
299-
return ConfigurationFactory.getInstance().getConfiguration(context, source);
321+
return (source != null) ? ConfigurationFactory.getInstance().getConfiguration(context, source) : null;
300322
}
301323

302-
private ConfigurationSource getConfigurationSource(URL url) throws IOException {
303-
InputStream stream = url.openStream();
304-
if (FILE_PROTOCOL.equals(url.getProtocol())) {
305-
return new ConfigurationSource(stream, ResourceUtils.getFile(url));
324+
private ConfigurationSource getConfigurationSource(URL url) throws IOException, URISyntaxException {
325+
AuthorizationProvider provider = ConfigurationFactory.authorizationProvider(PropertiesUtil.getProperties());
326+
SslConfiguration sslConfiguration = url.getProtocol().equals(HTTPS)
327+
? SslConfigurationFactory.getSslConfiguration() : null;
328+
URLConnection urlConnection = UrlConnectionFactory.createConnection(url, 0, sslConfiguration, provider);
329+
330+
File file = FileUtils.fileFromUri(url.toURI());
331+
try {
332+
if (file != null) {
333+
return new ConfigurationSource(urlConnection.getInputStream(), FileUtils.fileFromUri(url.toURI()));
334+
}
335+
return new ConfigurationSource(urlConnection.getInputStream(), url, urlConnection.getLastModified());
336+
}
337+
catch (FileNotFoundException ex) {
338+
LOGGER.info("Unable to locate file {}, ignoring.", url.toString());
339+
return null;
306340
}
307-
return new ConfigurationSource(stream, url);
308341
}
309342

310343
private CompositeConfiguration createComposite(List<Configuration> configurations) {
@@ -332,7 +365,7 @@ private void reinitializeWithOverrides(List<String> overrides) {
332365
try {
333366
configurations.add((AbstractConfiguration) load(override, context));
334367
}
335-
catch (IOException ex) {
368+
catch (Exception ex) {
336369
throw new RuntimeException("Failed to load overriding configuration from '" + override + "'", ex);
337370
}
338371
}

0 commit comments

Comments
 (0)