Sven Seelig created LOG4J2-3568:
-----------------------------------
Summary: ResolverUtil fails to extractPath for custom plugins in
jar, if there are blanks in the path
Key: LOG4J2-3568
URL: https://issues.apache.org/jira/browse/LOG4J2-3568
Project: Log4j 2
Issue Type: Bug
Components: Configuration
Affects Versions: 2.17.2
Environment: Windows 10
Windows Server 2019
Reporter: Sven Seelig
We are using plugins in our config, e.g.:
{noformat}
"configuration": {
"name": "DSSLog4JConfig",
"packages": "de.schufa.dss.adapter.log4j.plugin",
"properties": {
...
"appenders": {
...
"DssConsole": {
"name": "Dss-Console-Appender",
"PatternLayout": {
"pattern": "${sysPatternlayout}",
"charset": "UTF-8"
}
{noformat}
Everything works fine until the installation path of our application contains
one or more blanks, e.g. "C:\Program Files\DSS_13.0.1".
The plugin classes and the log4j2.json are delivered within jar files
(different jar files, same folder). The config-file itself is found and read.
We are accessing the context in a standard way:
{code:java}
LoggerContext log4j2LoggerContext =
(org.apache.logging.log4j.core.LoggerContext)
org.apache.logging.log4j.LogManager.getContext(true);
{code}
While trying to extract the path to our custom plugins, the PluginManager lands
here:
org.apache.logging.log4j.core.config.plugins.util.ResolverUtil#extractPath
{code:java}
String extractPath(final URL url) throws UnsupportedEncodingException,
URISyntaxException {
String urlPath = url.getPath(); // same as getFile but without the Query
portion
[...]
// For jar: URLs, the path part starts with "file:"
if (urlPath.startsWith("file:")) {
urlPath = urlPath.substring(5);
}
// If it was in a JAR, grab the path to the jar
final int bangIndex = urlPath.indexOf('!');
if (bangIndex > 0) {
urlPath = urlPath.substring(0, bangIndex);
}
[...]
final String cleanPath = new URI(urlPath).getPath(); {code}
Problem is, if the urlPath contains blank(s), the new URI(...) call will throw
an URISyntaxException and the plugins are not loaded.
Simple solution would be an additional check and replacement of the blanks with
"%20".
{code:java}
if(urlPath.contains(" ")){
// System.out.println("Blank in URL detected, will fail as URI! Replacing
with '%20'");
urlPath = urlPath.replaceAll(" ", "%20");
}
final String cleanPath = new URI(urlPath).getPath(); {code}
We built the current release-2,x from the repo
([https://gitbox.apache.org/repos/asf/logging-log4j2.git]), had the same issue
as before (2.17.2) but with this check added and it works.
As we can't run the maven build with tests (there seems to be a proxy issue for
the MongoDB Tests), we decided not to open a pull-request. Please let us know,
if you prefer a pull-request or if you need further information.
(i) We are using the log4j-bridge at the moment, maybe this issue only shows up
when using this besides log4j2 core and api (i)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)