ACS-9074 Bump log4j to 2.24.2 (#3087)

* ACS-9023 Bump log4j to 2.24.2

* ACS-9074 Update license header
This commit is contained in:
Damian Ujma
2024-12-13 10:11:04 +01:00
committed by GitHub
parent baafbbbeb2
commit a8faa94d15
2 changed files with 200 additions and 196 deletions

View File

@@ -79,7 +79,7 @@
<dependency.commons-httpclient.version>3.1-HTTPCLIENT-1265</dependency.commons-httpclient.version> <dependency.commons-httpclient.version>3.1-HTTPCLIENT-1265</dependency.commons-httpclient.version>
<dependency.xercesImpl.version>2.12.2</dependency.xercesImpl.version> <dependency.xercesImpl.version>2.12.2</dependency.xercesImpl.version>
<dependency.slf4j.version>2.0.16</dependency.slf4j.version> <dependency.slf4j.version>2.0.16</dependency.slf4j.version>
<dependency.log4j.version>2.23.1</dependency.log4j.version> <dependency.log4j.version>2.24.2</dependency.log4j.version>
<dependency.groovy.version>3.0.23</dependency.groovy.version> <dependency.groovy.version>3.0.23</dependency.groovy.version>
<dependency.tika.version>2.9.2</dependency.tika.version> <dependency.tika.version>2.9.2</dependency.tika.version>
<dependency.truezip.version>7.7.10</dependency.truezip.version> <dependency.truezip.version>7.7.10</dependency.truezip.version>

View File

@@ -1,195 +1,199 @@
/* /*
* #%L * #%L
* Alfresco Repository * Alfresco Repository
* %% * %%
* Copyright (C) 2005 - 2022 Alfresco Software Limited * Copyright (C) 2005 - 2024 Alfresco Software Limited
* %% * %%
* This file is part of the Alfresco software. * This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of * If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is * the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms: * provided under the following open source license terms:
* *
* Alfresco is free software: you can redistribute it and/or modify * Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by * it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* Alfresco is distributed in the hope that it will be useful, * Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. * GNU Lesser General Public License for more details.
* *
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L% * #L%
*/ */
package org.alfresco.repo.admin; package org.alfresco.repo.admin;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.LogFactory; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration;
import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration; import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder;
import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder; import org.springframework.beans.BeansException;
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationContextAware; import org.springframework.core.io.Resource;
import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
/**
/** * Initialises Log4j's HierarchyDynamicMBean (refer to core-services-context.xml) and any overriding log4.properties files. The actual implementation uses introspection to avoid any hard-coded references to Log4J classes. If Log4J is not present, this class will do nothing.
* Initialises Log4j's HierarchyDynamicMBean (refer to core-services-context.xml) and any overriding log4.properties files. * <p>
* The actual implementation uses introspection to avoid any hard-coded references to Log4J classes. If Log4J is * Alfresco modules can provide their own log4j2.properties file, which augments/overrides the global log4j2.properties within the Alfresco webapp. Within the module's source tree, suppose you create:
* not present, this class will do nothing. *
* <p> * <pre>
* Alfresco modules can provide their own log4j2.properties file, which augments/overrides the global log4j2.properties * config/alfresco/module/{module.id}/log4j2.properties
* within the Alfresco webapp. Within the module's source tree, suppose you create: * </pre>
* <pre> *
* config/alfresco/module/{module.id}/log4j2.properties * At deployment time, this log4j2.properties file will be placed in:
* </pre> *
* At deployment time, this log4j2.properties file will be placed in: * <pre>
* <pre> * WEB-INF/classes/alfresco/module/{module.id}/log4j2.properties
* WEB-INF/classes/alfresco/module/{module.id}/log4j2.properties * </pre>
* </pre> *
* Where {module.id} is whatever value is set within the AMP's module.properties file. For details, see: <a * Where {module.id} is whatever value is set within the AMP's module.properties file. For details, see: <a href='http://wiki.alfresco.com/wiki/Developing_an_Alfresco_Module'>Developing an Alfresco Module</a>
* href='http://wiki.alfresco.com/wiki/Developing_an_Alfresco_Module'>Developing an Alfresco Module</a> * <p>
* <p> * For example, if {module.id} is "org.alfresco.module.someModule", then within your source code you'll have:
* For example, if {module.id} is "org.alfresco.module.someModule", then within your source code you'll have: *
* * <pre>
* <pre> * config / alfresco / module / org.alfresco.module.someModule / log4j2.properties
* config / alfresco / module / org.alfresco.module.someModule / log4j2.properties * </pre>
* </pre> * <p>
* <p> * This would be deployed to:
* This would be deployed to: *
* <pre> * <pre>
* WEB - INF / classes / alfresco / module / org.alfresco.module.someModule / log4j2.properties * WEB - INF / classes / alfresco / module / org.alfresco.module.someModule / log4j2.properties
* </pre> * </pre>
*/ */
public class Log4JHierarchyInit implements ApplicationContextAware public class Log4JHierarchyInit implements ApplicationContextAware
{ {
private static final Log LOGGER = LogFactory.getLog(Log4JHierarchyInit.class); private static final Log LOGGER = LogFactory.getLog(Log4JHierarchyInit.class);
private final List<String> extraLog4jUrls; private final List<String> extraLog4jUrls;
private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
public Log4JHierarchyInit() static
{ {
extraLog4jUrls = new ArrayList<>(); System.setProperty("log4j2.disableJmx", "false");
} }
/** public Log4JHierarchyInit()
* Loads a set of augmenting/overriding log4j2.properties files from locations specified via an array of Spring URLS. {
* <p> extraLog4jUrls = new ArrayList<>();
* This function supports Spring's syntax for retrieving multiple class path resources with the same name, }
* via the "classpath&#042;:" prefix. For details, see: {@link PathMatchingResourcePatternResolver}.
*/ /**
public void setExtraLog4jUrls(List<String> urls) * Loads a set of augmenting/overriding log4j2.properties files from locations specified via an array of Spring URLS.
{ * <p>
extraLog4jUrls.addAll(urls); * This function supports Spring's syntax for retrieving multiple class path resources with the same name, via the "classpath&#042;:" prefix. For details, see: {@link PathMatchingResourcePatternResolver}.
} */
public void setExtraLog4jUrls(List<String> urls)
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
{ extraLog4jUrls.addAll(urls);
this.resolver = applicationContext; }
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
public void init() {
{ this.resolver = applicationContext;
importLogSettings(); }
}
public void init()
private void importLogSettings() {
{ importLogSettings();
try }
{
Properties mainProperties = new Properties(); private void importLogSettings()
{
importMainLogSettings(mainProperties); try
for (String url : extraLog4jUrls) {
{ Properties mainProperties = new Properties();
importLogSettings(url, mainProperties);
} importMainLogSettings(mainProperties);
for (String url : extraLog4jUrls)
PropertiesConfiguration propertiesConfiguration = new PropertiesConfigurationBuilder() {
.setConfigurationSource(null) importLogSettings(url, mainProperties);
.setRootProperties(mainProperties) }
.setLoggerContext((LoggerContext) LogManager.getContext(false))
.build(); PropertiesConfiguration propertiesConfiguration = new PropertiesConfigurationBuilder()
.setConfigurationSource(null)
propertiesConfiguration.initialize(); .setRootProperties(mainProperties)
((LoggerContext) LogManager.getContext(false)).reconfigure(propertiesConfiguration); .setLoggerContext((LoggerContext) LogManager.getContext(false))
} .build();
catch (Throwable t)
{ propertiesConfiguration.initialize();
if (LOGGER.isDebugEnabled()) ((LoggerContext) LogManager.getContext(false)).reconfigure(propertiesConfiguration);
{ }
LOGGER.debug("Failed to add extra Logger configuration: \n" + " Error: " + t.getMessage(), t); catch (Throwable t)
} {
} if (LOGGER.isDebugEnabled())
{
} LOGGER.debug("Failed to add extra Logger configuration: \n" + " Error: " + t.getMessage(), t);
}
private static void importMainLogSettings(Properties mainProperties) throws IOException }
{
File file = ((LoggerContext) LogManager.getContext()).getConfiguration().getConfigurationSource().getFile(); }
if (file != null)
{ private static void importMainLogSettings(Properties mainProperties) throws IOException
try (FileInputStream fis = new FileInputStream(file)) {
{ File file = ((LoggerContext) LogManager.getContext()).getConfiguration().getConfigurationSource().getFile();
mainProperties.load(fis); if (file != null)
} {
catch (FileNotFoundException e) try (FileInputStream fis = new FileInputStream(file))
{ {
if (LOGGER.isDebugEnabled()) mainProperties.load(fis);
{ }
LOGGER.debug("Failed to find initial configuration: \n" + " Error: " + e.getMessage(), e); catch (FileNotFoundException e)
} {
} if (LOGGER.isDebugEnabled())
} {
} LOGGER.debug("Failed to find initial configuration: \n" + " Error: " + e.getMessage(), e);
}
private void importLogSettings(String springUrl, Properties mainProperties) }
{ }
Resource[] resources = null; }
try private void importLogSettings(String springUrl, Properties mainProperties)
{ {
resources = resolver.getResources(springUrl); Resource[] resources = null;
}
catch (Exception e) try
{ {
LOGGER.warn("Failed to find additional Logger configuration: " + springUrl); resources = resolver.getResources(springUrl);
} }
catch (Exception e)
// Read each resource {
for (Resource resource : resources) LOGGER.warn("Failed to find additional Logger configuration: " + springUrl);
{ }
try
{ // Read each resource
InputStream inputStream = resource.getInputStream(); for (Resource resource : resources)
Properties properties = new Properties(); {
properties.load(inputStream); try
mainProperties.putAll(properties); {
} InputStream inputStream = resource.getInputStream();
catch (Throwable e) Properties properties = new Properties();
{ properties.load(inputStream);
if (LOGGER.isDebugEnabled()) mainProperties.putAll(properties);
{ }
LOGGER.debug("Failed to add extra Logger configuration: \n" + " URL: " + springUrl + "\n" catch (Throwable e)
+ " Error: " + e.getMessage(), e); {
} if (LOGGER.isDebugEnabled())
} {
} LOGGER.debug("Failed to add extra Logger configuration: \n" + " URL: " + springUrl + "\n"
} + " Error: " + e.getMessage(), e);
}
} }
}
}
}