mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
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:
2
pom.xml
2
pom.xml
@@ -79,7 +79,7 @@
|
||||
<dependency.commons-httpclient.version>3.1-HTTPCLIENT-1265</dependency.commons-httpclient.version>
|
||||
<dependency.xercesImpl.version>2.12.2</dependency.xercesImpl.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.tika.version>2.9.2</dependency.tika.version>
|
||||
<dependency.truezip.version>7.7.10</dependency.truezip.version>
|
||||
|
@@ -1,195 +1,199 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.repo.admin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.core.LoggerContext;
|
||||
import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration;
|
||||
import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
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.
|
||||
* <p>
|
||||
* 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:
|
||||
* <pre>
|
||||
* config/alfresco/module/{module.id}/log4j2.properties
|
||||
* </pre>
|
||||
* At deployment time, this log4j2.properties file will be placed in:
|
||||
* <pre>
|
||||
* WEB-INF/classes/alfresco/module/{module.id}/log4j2.properties
|
||||
* </pre>
|
||||
* 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>
|
||||
* <p>
|
||||
* For example, if {module.id} is "org.alfresco.module.someModule", then within your source code you'll have:
|
||||
*
|
||||
* <pre>
|
||||
* config / alfresco / module / org.alfresco.module.someModule / log4j2.properties
|
||||
* </pre>
|
||||
* <p>
|
||||
* This would be deployed to:
|
||||
* <pre>
|
||||
* WEB - INF / classes / alfresco / module / org.alfresco.module.someModule / log4j2.properties
|
||||
* </pre>
|
||||
*/
|
||||
public class Log4JHierarchyInit implements ApplicationContextAware
|
||||
{
|
||||
private static final Log LOGGER = LogFactory.getLog(Log4JHierarchyInit.class);
|
||||
private final List<String> extraLog4jUrls;
|
||||
private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
|
||||
|
||||
public Log4JHierarchyInit()
|
||||
{
|
||||
extraLog4jUrls = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a set of augmenting/overriding log4j2.properties files from locations specified via an array of Spring URLS.
|
||||
* <p>
|
||||
* This function supports Spring's syntax for retrieving multiple class path resources with the same name,
|
||||
* via the "classpath*:" prefix. For details, see: {@link PathMatchingResourcePatternResolver}.
|
||||
*/
|
||||
public void setExtraLog4jUrls(List<String> urls)
|
||||
{
|
||||
extraLog4jUrls.addAll(urls);
|
||||
}
|
||||
|
||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
|
||||
{
|
||||
this.resolver = applicationContext;
|
||||
}
|
||||
|
||||
public void init()
|
||||
{
|
||||
importLogSettings();
|
||||
}
|
||||
|
||||
private void importLogSettings()
|
||||
{
|
||||
try
|
||||
{
|
||||
Properties mainProperties = new Properties();
|
||||
|
||||
importMainLogSettings(mainProperties);
|
||||
for (String url : extraLog4jUrls)
|
||||
{
|
||||
importLogSettings(url, mainProperties);
|
||||
}
|
||||
|
||||
PropertiesConfiguration propertiesConfiguration = new PropertiesConfigurationBuilder()
|
||||
.setConfigurationSource(null)
|
||||
.setRootProperties(mainProperties)
|
||||
.setLoggerContext((LoggerContext) LogManager.getContext(false))
|
||||
.build();
|
||||
|
||||
propertiesConfiguration.initialize();
|
||||
((LoggerContext) LogManager.getContext(false)).reconfigure(propertiesConfiguration);
|
||||
}
|
||||
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)
|
||||
{
|
||||
try (FileInputStream fis = new FileInputStream(file))
|
||||
{
|
||||
mainProperties.load(fis);
|
||||
}
|
||||
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
|
||||
{
|
||||
resources = resolver.getResources(springUrl);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.warn("Failed to find additional Logger configuration: " + springUrl);
|
||||
}
|
||||
|
||||
// Read each resource
|
||||
for (Resource resource : resources)
|
||||
{
|
||||
try
|
||||
{
|
||||
InputStream inputStream = resource.getInputStream();
|
||||
Properties properties = new Properties();
|
||||
properties.load(inputStream);
|
||||
mainProperties.putAll(properties);
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
if (LOGGER.isDebugEnabled())
|
||||
{
|
||||
LOGGER.debug("Failed to add extra Logger configuration: \n" + " URL: " + springUrl + "\n"
|
||||
+ " Error: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2024 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.repo.admin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.core.LoggerContext;
|
||||
import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration;
|
||||
import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
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.
|
||||
* <p>
|
||||
* 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:
|
||||
*
|
||||
* <pre>
|
||||
* config/alfresco/module/{module.id}/log4j2.properties
|
||||
* </pre>
|
||||
*
|
||||
* At deployment time, this log4j2.properties file will be placed in:
|
||||
*
|
||||
* <pre>
|
||||
* WEB-INF/classes/alfresco/module/{module.id}/log4j2.properties
|
||||
* </pre>
|
||||
*
|
||||
* 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>
|
||||
* <p>
|
||||
* For example, if {module.id} is "org.alfresco.module.someModule", then within your source code you'll have:
|
||||
*
|
||||
* <pre>
|
||||
* config / alfresco / module / org.alfresco.module.someModule / log4j2.properties
|
||||
* </pre>
|
||||
* <p>
|
||||
* This would be deployed to:
|
||||
*
|
||||
* <pre>
|
||||
* WEB - INF / classes / alfresco / module / org.alfresco.module.someModule / log4j2.properties
|
||||
* </pre>
|
||||
*/
|
||||
public class Log4JHierarchyInit implements ApplicationContextAware
|
||||
{
|
||||
private static final Log LOGGER = LogFactory.getLog(Log4JHierarchyInit.class);
|
||||
private final List<String> extraLog4jUrls;
|
||||
private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
|
||||
|
||||
static
|
||||
{
|
||||
System.setProperty("log4j2.disableJmx", "false");
|
||||
}
|
||||
|
||||
public Log4JHierarchyInit()
|
||||
{
|
||||
extraLog4jUrls = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a set of augmenting/overriding log4j2.properties files from locations specified via an array of Spring URLS.
|
||||
* <p>
|
||||
* This function supports Spring's syntax for retrieving multiple class path resources with the same name, via the "classpath*:" prefix. For details, see: {@link PathMatchingResourcePatternResolver}.
|
||||
*/
|
||||
public void setExtraLog4jUrls(List<String> urls)
|
||||
{
|
||||
extraLog4jUrls.addAll(urls);
|
||||
}
|
||||
|
||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
|
||||
{
|
||||
this.resolver = applicationContext;
|
||||
}
|
||||
|
||||
public void init()
|
||||
{
|
||||
importLogSettings();
|
||||
}
|
||||
|
||||
private void importLogSettings()
|
||||
{
|
||||
try
|
||||
{
|
||||
Properties mainProperties = new Properties();
|
||||
|
||||
importMainLogSettings(mainProperties);
|
||||
for (String url : extraLog4jUrls)
|
||||
{
|
||||
importLogSettings(url, mainProperties);
|
||||
}
|
||||
|
||||
PropertiesConfiguration propertiesConfiguration = new PropertiesConfigurationBuilder()
|
||||
.setConfigurationSource(null)
|
||||
.setRootProperties(mainProperties)
|
||||
.setLoggerContext((LoggerContext) LogManager.getContext(false))
|
||||
.build();
|
||||
|
||||
propertiesConfiguration.initialize();
|
||||
((LoggerContext) LogManager.getContext(false)).reconfigure(propertiesConfiguration);
|
||||
}
|
||||
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)
|
||||
{
|
||||
try (FileInputStream fis = new FileInputStream(file))
|
||||
{
|
||||
mainProperties.load(fis);
|
||||
}
|
||||
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
|
||||
{
|
||||
resources = resolver.getResources(springUrl);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.warn("Failed to find additional Logger configuration: " + springUrl);
|
||||
}
|
||||
|
||||
// Read each resource
|
||||
for (Resource resource : resources)
|
||||
{
|
||||
try
|
||||
{
|
||||
InputStream inputStream = resource.getInputStream();
|
||||
Properties properties = new Properties();
|
||||
properties.load(inputStream);
|
||||
mainProperties.putAll(properties);
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
if (LOGGER.isDebugEnabled())
|
||||
{
|
||||
LOGGER.debug("Failed to add extra Logger configuration: \n" + " URL: " + springUrl + "\n"
|
||||
+ " Error: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user