This is an automated email from the ASF dual-hosted git repository.
mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push:
new c86a214681 Remove OFBizDynamicThresholdFilter
c86a214681 is described below
commit c86a214681716ae2c9a70f52f2a219431167db36
Author: Mridul Pathak <[email protected]>
AuthorDate: Sat Oct 24 23:43:34 2026 +0530
Remove OFBizDynamicThresholdFilter
The filter was declared for the whole Log4j configuration, so it ran on
every logging call, building a new context data map each time, only to keep the
getJs requests at the ERROR level. It also relied on internal Log4j classes and
on the plugin package scanning in log4j2.xml. With it go the ThreadContext
"uri" entries set by ControlFilter and CatalogUrlFilter, and log4j-core becomes
a runtime dependency (and a test one for EntityEcaUtilConcurrencyTest). The
getJs requests now log lik [...]
Thanks: Jacopo Cappellato for the suggestion
---
.../ofbiz/product/category/CatalogUrlFilter.java | 15 +-
dependencies.gradle | 3 +-
framework/base/config/log4j2.xml | 6 +-
.../base/log4j/OFBizDynamicThresholdFilter.java | 264 ---------------------
.../apache/ofbiz/webapp/control/ControlFilter.java | 10 +-
5 files changed, 6 insertions(+), 292 deletions(-)
diff --git
a/applications/product/src/main/java/org/apache/ofbiz/product/category/CatalogUrlFilter.java
b/applications/product/src/main/java/org/apache/ofbiz/product/category/CatalogUrlFilter.java
index a8baf0e30a..3580025bf1 100644
---
a/applications/product/src/main/java/org/apache/ofbiz/product/category/CatalogUrlFilter.java
+++
b/applications/product/src/main/java/org/apache/ofbiz/product/category/CatalogUrlFilter.java
@@ -33,7 +33,6 @@ import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-import org.apache.logging.log4j.ThreadContext;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.StringUtil;
import org.apache.ofbiz.base.util.StringUtil.StringWrapper;
@@ -345,18 +344,8 @@ public class CatalogUrlFilter implements Filter {
//Check path alias
UrlServletHelper.checkPathAlias(request, httpResponse, delegator,
pathInfo);
}
- try {
- String uriWithContext = httpRequest.getRequestURI();
- String context = httpRequest.getContextPath();
- String uri = uriWithContext.substring(context.length());
- // support OFBizDynamicThresholdFilter in log4j2.xml
- ThreadContext.put("uri", uri);
-
- // we're done checking; continue on
- chain.doFilter(request, response);
- } finally {
- ThreadContext.remove("uri");
- }
+ // we're done checking; continue on
+ chain.doFilter(request, response);
}
@Override
diff --git a/dependencies.gradle b/dependencies.gradle
index 56ca2d9510..a5f2ef780c 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -49,7 +49,6 @@ dependencies {
implementation libs.geronimo.jms.spec
implementation libs.httpclient.cache
implementation libs.log4j.api // the API of log4j 2
- implementation libs.log4j.core // Somehow needed by Buildbot to compile
OFBizDynamicThresholdFilter.java
implementation libs.log4j.layout.template.json // JSON/ECS structured
logging profile (log4j2-json.xml)
implementation libs.poi
implementation libs.poi.ooxml
@@ -97,6 +96,7 @@ dependencies {
testImplementation libs.junit.platform.launcher
testImplementation libs.hamcrest.library
testImplementation libs.mockito.core
+ testImplementation libs.log4j.core // EntityEcaUtilConcurrencyTest
captures log events
runtimeOnly libs.javax.xml.soap.api
runtimeOnly libs.barcode4j.fop.ext
@@ -106,6 +106,7 @@ dependencies {
runtimeOnly libs.axis2.transport.local
runtimeOnly libs.h2
runtimeOnly libs.geronimo.jaxrpc.spec
+ runtimeOnly libs.log4j.core // the implementation of log4j 2
runtimeOnly libs.log4j.legacy.api // for external jars using the old
log4j1.2: routes logging to log4j 2
runtimeOnly libs.log4j.jul // for external jars using the
java.util.logging: routes logging to log4j 2
runtimeOnly libs.log4j.slf4j2.impl // for external jars using slf4j 2.x:
routes logging to log4j 2
diff --git a/framework/base/config/log4j2.xml b/framework/base/config/log4j2.xml
index 64b3524604..d7ad016550 100644
--- a/framework/base/config/log4j2.xml
+++ b/framework/base/config/log4j2.xml
@@ -17,7 +17,7 @@ KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
-<Configuration monitorInterval="60" packages="org.apache.ofbiz.base.log4j">
+<Configuration monitorInterval="60">
<!--
Source line numbers in log output are enabled by default.
To disable for production, set/uncomment systemProp.ofbiz.env=prod in
gradle.properties.
@@ -39,10 +39,6 @@ under the License.
-->
<Property
name="jsonLogTemplateUri">${sys:ofbiz.json.logs.template:-classpath:templates/ecs-layout.json}</Property>
</Properties>
- <OFBizDynamicThresholdFilter key="uri" onMatch="ACCEPT" onMismatch="DENY">
- <KeyValuePair key="/getJs" value="ERROR"/>
- <KeyValuePair key="/control/getJs" value="ERROR"/>
- </OFBizDynamicThresholdFilter>
<!--
Default configuration for logging; for customizations refer to
http://logging.apache.org/log4j/2.x/manual/configuration.html.
diff --git
a/framework/base/src/main/java/org/apache/ofbiz/base/log4j/OFBizDynamicThresholdFilter.java
b/framework/base/src/main/java/org/apache/ofbiz/base/log4j/OFBizDynamicThresholdFilter.java
deleted file mode 100644
index 5e8e56075d..0000000000
---
a/framework/base/src/main/java/org/apache/ofbiz/base/log4j/OFBizDynamicThresholdFilter.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
-
*******************************************************************************/
-package org.apache.ofbiz.base.log4j;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Marker;
-import org.apache.logging.log4j.core.ContextDataInjector;
-import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.filter.AbstractFilter;
-import org.apache.logging.log4j.core.impl.ContextDataFactory;
-import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
-import org.apache.logging.log4j.util.StringMap;
-import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.apache.logging.log4j.message.Message;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.ofbiz.base.util.Debug;
-
-/**
- * Adapted from {@link
org.apache.logging.log4j.core.filter.DynamicThresholdFilter}
- * Check for active individual levels instead of default threshold
- */
-@Plugin(name = "OFBizDynamicThresholdFilter", category = Node.CATEGORY,
elementType = Filter.ELEMENT_TYPE, printObject = true)
-@PerformanceSensitive("allocation")
-public final class OFBizDynamicThresholdFilter extends AbstractFilter {
-
- /**
- * Creates a DynamicThresholdFilter.
- * @param key The name of the key to compare.
- * @param pairs An array of value and Level pairs.
- * @param onMatch The action to perform if a match occurs.
- * @param onMismatch The action to perform if no match occurs.
- * @return The DynamicThresholdFilter.
- */
- // TODO Consider refactoring to use AbstractFilter.AbstractFilterBuilder
- @PluginFactory
- public static OFBizDynamicThresholdFilter createFilter(
- @PluginAttribute("key") final String key,
- @PluginElement("Pairs") final KeyValuePair[] pairs,
- @PluginAttribute("onMatch") final Result onMatch,
- @PluginAttribute("onMismatch") final Result onMismatch) {
- final Map<String, Level> map = new HashMap<>();
- for (final KeyValuePair pair : pairs) {
- map.put(pair.getKey(), Level.toLevel(pair.getValue()));
- }
- return new OFBizDynamicThresholdFilter(key, map, onMatch, onMismatch);
- }
-
- private final String key;
- private final ContextDataInjector injector =
ContextDataInjectorFactory.createInjector();
- private Map<String, Level> levelMap = new HashMap<>();
-
- private OFBizDynamicThresholdFilter(final String key, final Map<String,
Level> pairs,
- final Result onMatch, final Result
onMismatch) {
- super(onMatch, onMismatch);
- Objects.requireNonNull(key, "key cannot be null");
- this.key = key;
- this.levelMap = pairs;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equalsImpl(obj)) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final OFBizDynamicThresholdFilter other =
(OFBizDynamicThresholdFilter) obj;
- if (key == null) {
- if (other.key != null) {
- return false;
- }
- } else if (!key.equals(other.key)) {
- return false;
- }
- if (levelMap == null) {
- if (other.levelMap != null) {
- return false;
- }
- } else if (!levelMap.equals(other.levelMap)) {
- return false;
- }
- return true;
- }
-
- private Result filter(final Level level, final ReadOnlyStringMap
contextMap) {
- final String value = contextMap.getValue(key);
- Level ctxLevel = null;
- if (value != null && !"".equals(value)) {
- ctxLevel = levelMap.get(value);
- }
- if (ctxLevel == null) {
- return Result.NEUTRAL;
- }
- int intLevel = level.intLevel() / 100;
- boolean isOn = Debug.isOn(intLevel) &&
level.isMoreSpecificThan(ctxLevel);
- return isOn ? onMatch : onMismatch;
- }
-
- @Override
- public Result filter(final LogEvent event) {
- return filter(event.getLevel(), event.getContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final Message msg,
- final Throwable t) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final Object msg,
- final Throwable t) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object... params) {
- return filter(level, currentContextData());
- }
-
- private ReadOnlyStringMap currentContextData() {
- StringMap contextData = ContextDataFactory.createContextData();
- return injector.injectContextData(null, contextData);
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3,
- final Object p4) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3,
- final Object p4, final Object p5) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3,
- final Object p4, final Object p5, final Object p6) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3,
- final Object p4, final Object p5, final Object p6,
- final Object p7) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3,
- final Object p4, final Object p5, final Object p6,
- final Object p7, final Object p8) {
- return filter(level, currentContextData());
- }
-
- @Override
- public Result filter(final Logger logger, final Level level, final Marker
marker, final String msg,
- final Object p0, final Object p1, final Object p2,
final Object p3,
- final Object p4, final Object p5, final Object p6,
- final Object p7, final Object p8, final Object p9) {
- return filter(level, currentContextData());
- }
-
- public String getKey() {
- return this.key;
- }
-
- public Map<String, Level> getLevelMap() {
- return levelMap;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCodeImpl();
- result = prime * result + ((key == null) ? 0 : key.hashCode());
- result = prime * result + ((levelMap == null) ? 0 :
levelMap.hashCode());
- return result;
- }
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder();
- sb.append("key=").append(key);
- sb.append(", ");
- if (levelMap.size() > 0) {
- sb.append('{');
- boolean first = true;
- for (final Map.Entry<String, Level> entry : levelMap.entrySet()) {
- if (!first) {
- sb.append(", ");
- first = false;
- }
- sb.append(entry.getKey()).append('=').append(entry.getValue());
- }
- sb.append('}');
- }
- return sb.toString();
- }
-}
diff --git
a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
index aaf7139a8d..9802892950 100644
---
a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
+++
b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
@@ -33,7 +33,6 @@ import java.util.stream.Collectors;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.commons.validator.routines.UrlValidator;
-import org.apache.logging.log4j.ThreadContext;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilHttp;
@@ -238,14 +237,7 @@ public class ControlFilter extends HttpFilter {
// Check if the requested URI is allowed.
if (allowedPaths.stream().anyMatch(uri::startsWith)) {
- try {
- // support OFBizDynamicThresholdFilter in log4j2.xml
- ThreadContext.put("uri", uri);
-
- chain.doFilter(req, resp);
- } finally {
- ThreadContext.remove("uri");
- }
+ chain.doFilter(req, resp);
} else {
if (redirectPath == null) {
resp.sendError(errorCode, uriWithContext);