This is an automated email from the ASF dual-hosted git repository.

joewitt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 97198e3  NIFI-9382: This closes #5584. Added system test that 
replicates issue in which a closed shared classloader causes issues when used 
again NIFI-9382: Fixed issue with SharedInstanceClassLoader where the 
classloader may get closed but then get used again. When the 
SharedInstanceClassLoader is closed, we will now ensure that we don't use 
anymore and instead create a new one.
97198e3 is described below

commit 97198e35a04c12e66684d9545ff24156d16c60f6
Author: Mark Payne <[email protected]>
AuthorDate: Wed Dec 8 11:14:23 2021 -0500

    NIFI-9382: This closes #5584. Added system test that replicates issue in 
which a closed shared classloader causes issues when used again
    NIFI-9382: Fixed issue with SharedInstanceClassLoader where the classloader 
may get closed but then get used again. When the SharedInstanceClassLoader is 
closed, we will now ensure that we don't use anymore and instead create a new 
one.
    
    Signed-off-by: Joe Witt <[email protected]>
---
 .../processors/hadoop/AbstractHadoopProcessor.java |  2 +-
 .../service/StandardControllerServiceNode.java     |  5 +-
 .../org/apache/nifi/nar/InstanceClassLoader.java   |  4 --
 .../nifi/nar/NarThreadContextClassLoader.java      |  1 +
 .../apache/nifi/nar/SharedInstanceClassLoader.java |  9 +++-
 .../nar/StandardExtensionDiscoveringManager.java   |  8 ++--
 .../tests/system/WriteFlowFileCountToFile.java     | 30 ++++++++++--
 .../classloaders/ClassloaderIsolationKeyIT.java    | 55 ++++++++++++++++++++++
 .../resources/conf/clustered/node1/logback.xml     | 41 +++++++++++++---
 .../resources/conf/clustered/node2/logback.xml     | 45 ++++++++++++++----
 .../src/test/resources/conf/default/logback.xml    | 43 +++++++++++++++--
 11 files changed, 208 insertions(+), 35 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-extension-utils/nifi-hadoop-utils/src/main/java/org/apache/nifi/processors/hadoop/AbstractHadoopProcessor.java
 
b/nifi-nar-bundles/nifi-extension-utils/nifi-hadoop-utils/src/main/java/org/apache/nifi/processors/hadoop/AbstractHadoopProcessor.java
index 222effd..7c574a7 100644
--- 
a/nifi-nar-bundles/nifi-extension-utils/nifi-hadoop-utils/src/main/java/org/apache/nifi/processors/hadoop/AbstractHadoopProcessor.java
+++ 
b/nifi-nar-bundles/nifi-extension-utils/nifi-hadoop-utils/src/main/java/org/apache/nifi/processors/hadoop/AbstractHadoopProcessor.java
@@ -205,7 +205,7 @@ public abstract class AbstractHadoopProcessor extends 
AbstractProcessor implemen
 
     @Override
     public String getClassloaderIsolationKey(final PropertyContext context) {
-        final String explicitKerberosPrincipal = 
context.getProperty(kerberosProperties.getKerberosPrincipal()).getValue();
+        final String explicitKerberosPrincipal = 
context.getProperty(kerberosProperties.getKerberosPrincipal()).evaluateAttributeExpressions().getValue();
         if (explicitKerberosPrincipal != null) {
             return explicitKerberosPrincipal;
         }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
index bdae2b1..8593201 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
@@ -338,8 +338,9 @@ public class StandardControllerServiceNode extends 
AbstractComponentNode impleme
 
     @Override
     public void verifyCanEnable() {
-        if (getState() != ControllerServiceState.DISABLED) {
-            throw new 
IllegalStateException(getControllerServiceImplementation().getIdentifier() + " 
cannot be enabled because it is not disabled");
+        final ControllerServiceState state = getState();
+        if (state != ControllerServiceState.DISABLED) {
+            throw new 
IllegalStateException(getControllerServiceImplementation().getIdentifier() + " 
cannot be enabled because it is not disabled - it has a state of " + state);
         }
     }
 
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/InstanceClassLoader.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/InstanceClassLoader.java
index e7153d7..b024bb5 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/InstanceClassLoader.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/InstanceClassLoader.java
@@ -69,10 +69,6 @@ public class InstanceClassLoader extends 
AbstractNativeLibHandlingClassLoader {
         this.instanceType = type;
         this.instanceUrls = instanceUrls == null ? Collections.emptySet() : 
Collections.unmodifiableSet(new HashSet<>(instanceUrls));
         this.additionalResourceUrls = additionalResourceUrls == null ? 
Collections.emptySet() : Collections.unmodifiableSet(new 
HashSet<>(additionalResourceUrls));
-
-        if (parent instanceof SharedInstanceClassLoader) {
-            ((SharedInstanceClassLoader) parent).incrementReferenceCount();
-        }
     }
 
     @Override
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/NarThreadContextClassLoader.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/NarThreadContextClassLoader.java
index 949d207..915afa5 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/NarThreadContextClassLoader.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/NarThreadContextClassLoader.java
@@ -266,6 +266,7 @@ public class NarThreadContextClassLoader extends 
URLClassLoader {
 
     private static ClassLoader createClassLoader(final String 
implementationClassName, final String instanceId, final Bundle bundle, final 
ExtensionManager extensionManager)
                 throws ClassNotFoundException {
+
         final ClassLoader bundleClassLoader = bundle.getClassLoader();
         final Class<?> rawClass = Class.forName(implementationClassName, true, 
bundleClassLoader);
 
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/SharedInstanceClassLoader.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/SharedInstanceClassLoader.java
index 5aabef6..5ec1327 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/SharedInstanceClassLoader.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/SharedInstanceClassLoader.java
@@ -24,6 +24,7 @@ import java.util.Set;
 
 public class SharedInstanceClassLoader extends InstanceClassLoader {
     private long referenceCount = 0L;
+    private boolean closed = false;
 
     public SharedInstanceClassLoader(final String identifier, final String 
type, final Set<URL> instanceUrls, final Set<URL> additionalResourceUrls,
                                      final Set<File> narNativeLibDirs, final 
ClassLoader parent) {
@@ -35,11 +36,17 @@ public class SharedInstanceClassLoader extends 
InstanceClassLoader {
         referenceCount--;
 
         if (referenceCount <= 0) {
+            closed = true;
             super.close();
         }
     }
 
-    public synchronized void incrementReferenceCount() {
+    public synchronized boolean incrementReferenceCount() {
+        if (closed) {
+            return false;
+        }
+
         referenceCount++;
+        return true;
     }
 }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/StandardExtensionDiscoveringManager.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/StandardExtensionDiscoveringManager.java
index baa29b6..f8e1806 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/StandardExtensionDiscoveringManager.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-nar-utils/src/main/java/org/apache/nifi/nar/StandardExtensionDiscoveringManager.java
@@ -88,7 +88,7 @@ public class StandardExtensionDiscoveringManager implements 
ExtensionDiscovering
     private final Map<String, ConfigurableComponent> tempComponentLookup = new 
HashMap<>();
 
     private final Map<String, InstanceClassLoader> instanceClassloaderLookup = 
new ConcurrentHashMap<>();
-    private final ConcurrentMap<BaseClassLoaderKey, ClassLoader> 
sharedBaseClassloaders = new ConcurrentHashMap<>();
+    private final ConcurrentMap<BaseClassLoaderKey, SharedInstanceClassLoader> 
sharedBaseClassloaders = new ConcurrentHashMap<>();
 
     public StandardExtensionDiscoveringManager() {
         this(Collections.emptyList());
@@ -407,8 +407,8 @@ public class StandardExtensionDiscoveringManager implements 
ExtensionDiscovering
                 if (requiresInstanceClassLoading.cloneAncestorResources()) {
                     // Check to see if there's already a shared ClassLoader 
that can be used as the parent/base classloader
                     if (baseClassLoaderKey != null) {
-                        final ClassLoader sharedBaseClassloader = 
sharedBaseClassloaders.get(baseClassLoaderKey);
-                        if (sharedBaseClassloader != null) {
+                        final SharedInstanceClassLoader sharedBaseClassloader 
= sharedBaseClassloaders.get(baseClassLoaderKey);
+                        if (sharedBaseClassloader != null && 
sharedBaseClassloader.incrementReferenceCount()) {
                             resolvedSharedClassLoader = true;
                             ancestorClassLoader = sharedBaseClassloader;
                             logger.debug("Creating InstanceClassLoader for 
type {} using shared Base ClassLoader {} for component {}", type, 
sharedBaseClassloader, instanceIdentifier);
@@ -444,6 +444,8 @@ public class StandardExtensionDiscoveringManager implements 
ExtensionDiscovering
                     // Created a shared class loader that is everything we 
need except for the additional URLs, as the additional URLs are 
instance-specific.
                     final SharedInstanceClassLoader sharedClassLoader = new 
SharedInstanceClassLoader(instanceIdentifier, classType, instanceUrls,
                         Collections.emptySet(), narNativeLibDirs, 
ancestorClassLoader);
+                    sharedClassLoader.incrementReferenceCount();
+
                     instanceClassLoader = new 
InstanceClassLoader(instanceIdentifier, classType, Collections.emptySet(), 
additionalUrls, Collections.emptySet(), sharedClassLoader);
 
                     logger.debug("Creating InstanceClassLoader for type {} 
using newly created shared Base ClassLoader {} for component {}", type, 
sharedClassLoader, instanceIdentifier);
diff --git 
a/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/processors/tests/system/WriteFlowFileCountToFile.java
 
b/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/processors/tests/system/WriteFlowFileCountToFile.java
index 7e78f0a..ef6eb75 100644
--- 
a/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/processors/tests/system/WriteFlowFileCountToFile.java
+++ 
b/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/processors/tests/system/WriteFlowFileCountToFile.java
@@ -34,7 +34,7 @@ import java.io.FileOutputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
@@ -64,18 +64,31 @@ public class WriteFlowFileCountToFile extends 
AbstractProcessor implements Class
         .defaultValue("counts.txt")
         .build();
 
+    static final PropertyDescriptor CLASS_TO_CREATE = new Builder()
+        .name("Class to Create")
+        .displayName("Class to Create")
+        .description("If specified, each iteration of #onTrigger will create 
an instance of this class in order to test ClassLoader behavior. If unable to 
create the object, the FlowFile will be " +
+            "routed to failure")
+        .required(false)
+        .addValidator(NON_EMPTY_VALIDATOR)
+        .build();
+
     private final Relationship REL_SUCCESS = new Relationship.Builder()
         .name("success")
         .build();
+    private final Relationship REL_FAILURE = new Relationship.Builder()
+        .name("failure")
+        .autoTerminateDefault(true)
+        .build();
 
     @Override
     protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        return Arrays.asList(ISOLATION_KEY, FILE_TO_WRITE);
+        return Arrays.asList(ISOLATION_KEY, FILE_TO_WRITE, CLASS_TO_CREATE);
     }
 
     @Override
     public Set<Relationship> getRelationships() {
-        return Collections.singleton(REL_SUCCESS);
+        return new HashSet<>(Arrays.asList(REL_SUCCESS, REL_FAILURE));
     }
 
     @Override
@@ -90,6 +103,17 @@ public class WriteFlowFileCountToFile extends 
AbstractProcessor implements Class
             return;
         }
 
+        final String className = 
context.getProperty(CLASS_TO_CREATE).getValue();
+        if (className != null) {
+            try {
+                Class.forName(className, true, 
Thread.currentThread().getContextClassLoader());
+            } catch (final ClassNotFoundException e) {
+                getLogger().error("Failed to load class {} for {}; routing to 
failure", className, flowFile);
+                session.transfer(flowFile, REL_FAILURE);
+                return;
+            }
+        }
+
         final long counterValue = counter.incrementAndGet();
         final byte[] fileContents = 
String.valueOf(counterValue).getBytes(StandardCharsets.UTF_8);
 
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/classloaders/ClassloaderIsolationKeyIT.java
 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/classloaders/ClassloaderIsolationKeyIT.java
index 0665ae8..4c5fb82 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/classloaders/ClassloaderIsolationKeyIT.java
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/classloaders/ClassloaderIsolationKeyIT.java
@@ -19,6 +19,7 @@ package org.apache.nifi.tests.system.classloaders;
 
 import org.apache.nifi.tests.system.NiFiSystemIT;
 import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException;
+import org.apache.nifi.web.api.entity.ConnectionEntity;
 import org.apache.nifi.web.api.entity.ProcessorEntity;
 import org.junit.Test;
 
@@ -28,8 +29,62 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.util.Collections;
 
+import static org.junit.Assert.assertEquals;
+
 public class ClassloaderIsolationKeyIT extends NiFiSystemIT {
 
+    /**
+     * After creating 1+ processors with the same ClassLoader Isolation Key, 
and then removing them,
+     * the SharedInstanceClassLoader will be closed. If we then create a new 
processor with the same
+     * ClassLoader Isolation Key, we need to ensure that we are then able to 
load classes from the ClassLoader
+     * that were not loaded previously.
+     */
+    @Test
+    public void 
testRemoveAllInstancesThenCreateForSameIsolationKeyAllowsClassLoading() throws 
NiFiClientException, IOException, InterruptedException {
+        final ProcessorEntity generate = 
getClientUtil().createProcessor("GenerateFlowFile");
+        final ProcessorEntity counter = 
getClientUtil().createProcessor("WriteFlowFileCountToFile");
+        final ProcessorEntity terminate = 
getClientUtil().createProcessor("TerminateFlowFile");
+
+        getClientUtil().updateProcessorProperties(counter, 
Collections.singletonMap("File to Write", "count1.txt"));
+        getClientUtil().updateProcessorProperties(counter, 
Collections.singletonMap("Isolation Key", "abc123"));
+
+        getClientUtil().createConnection(generate, counter, "success");
+        final ConnectionEntity counterToTerminate = 
getClientUtil().createConnection(counter, terminate, "success");
+
+        getClientUtil().waitForValidProcessor(counter.getId());
+
+        getClientUtil().startProcessor(generate);
+        getClientUtil().startProcessor(counter);
+
+        waitForQueueCount(counterToTerminate.getId(), 1);
+
+        // Stop components, purge FlowFiles, delete all components
+        destroyFlow();
+
+        final ProcessorEntity newGenerate = 
getClientUtil().createProcessor("GenerateFlowFile");
+        final ProcessorEntity newCounter = 
getClientUtil().createProcessor("WriteFlowFileCountToFile");
+        final ProcessorEntity terminateSuccess = 
getClientUtil().createProcessor("TerminateFlowFile");
+        final ProcessorEntity terminateFailure = 
getClientUtil().createProcessor("TerminateFlowFile");
+
+        final ConnectionEntity generateToCounter = 
getClientUtil().createConnection(newGenerate, newCounter, "success");
+        final ConnectionEntity counterSuccess = 
getClientUtil().createConnection(newCounter, terminateSuccess, "success");
+        final ConnectionEntity counterFailure = 
getClientUtil().createConnection(newCounter, terminateFailure, "failure");
+
+        getClientUtil().updateProcessorProperties(newCounter, 
Collections.singletonMap("Class to Create", 
"org.apache.nifi.processors.tests.system.CountEvents"));
+        getClientUtil().updateProcessorProperties(newCounter, 
Collections.singletonMap("File to Write", "count1.txt"));
+        getClientUtil().updateProcessorProperties(newCounter, 
Collections.singletonMap("Isolation Key", "abc123"));
+
+        getClientUtil().waitForValidProcessor(newCounter.getId());
+
+        getClientUtil().startProcessor(newGenerate);
+        getClientUtil().startProcessor(newCounter);
+
+        waitForQueueCount(generateToCounter.getId(), 0);
+        assertEquals(0, getConnectionQueueSize(counterFailure.getId()));
+        assertEquals(1, getConnectionQueueSize(counterSuccess.getId()));
+    }
+
+
     @Test
     public void testClassloaderChanges() throws NiFiClientException, 
IOException, InterruptedException {
         final ProcessorEntity generate = 
getClientUtil().createProcessor("GenerateFlowFile");
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/logback.xml
 
b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/logback.xml
index 6c3f0bb..c9bc033 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/logback.xml
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/logback.xml
@@ -57,6 +57,17 @@
         </encoder>
     </appender>
 
+    <appender name="REQUEST_FILE" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
+        
<file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-request.log</file>
+        <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            
<fileNamePattern>${org.apache.nifi.bootstrap.config.log.dir}/nifi-request_%d.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%msg%n</pattern>
+        </encoder>
+    </appender>
+
     <appender name="BOOTSTRAP_FILE" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
         
<file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-bootstrap.log</file>
         <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -82,21 +93,22 @@
     </appender>
 
     <!-- valid logging levels: TRACE, DEBUG, INFO, WARN, ERROR -->
+
     <logger name="org.apache.nifi" level="INFO"/>
     <logger name="org.apache.nifi.processors" level="INFO"/>
     <logger name="org.apache.nifi.processors.standard.LogAttribute" 
level="INFO"/>
     <logger name="org.apache.nifi.processors.standard.LogMessage" 
level="INFO"/>
     <logger 
name="org.apache.nifi.controller.repository.StandardProcessSession" 
level="WARN" />
-    <logger name="org.apache.nifi.connectable.LocalPort" level="DEBUG"/>
-    <logger 
name="org.apache.nifi.web.util.ClusterReplicationComponentLifecycle" 
level="DEBUG" />
 
 
     <logger name="org.apache.zookeeper.ClientCnxn" level="ERROR" />
     <logger name="org.apache.zookeeper.server.NIOServerCnxn" level="ERROR" />
     <logger name="org.apache.zookeeper.server.NIOServerCnxnFactory" 
level="ERROR" />
+    <logger name="org.apache.zookeeper.server.NettyServerCnxnFactory" 
level="ERROR" />
     <logger name="org.apache.zookeeper.server.quorum" level="ERROR" />
     <logger name="org.apache.zookeeper.ZooKeeper" level="ERROR" />
     <logger name="org.apache.zookeeper.server.PrepRequestProcessor" 
level="ERROR" />
+    <logger name="org.apache.nifi.controller.reporting.LogComponentStatuses" 
level="ERROR" />
 
     <logger name="org.apache.calcite.runtime.CalciteException" level="OFF" />
 
@@ -128,6 +140,17 @@
     <!-- Suppress non-error messages from SMBJ which was emitting large 
amounts of INFO logs by default -->
     <logger name="com.hierynomus.smbj" level="WARN" />
 
+    <!-- Suppress non-error messages from AWS KCL which was emitting large 
amounts of INFO logs by default -->
+    <logger name="com.amazonaws.services.kinesis" level="WARN" />
+
+    <!-- Suppress non-error messages from Apache Atlas which was emitting 
large amounts of INFO logs by default -->
+    <logger name="org.apache.atlas" level="WARN"/>
+
+    <!-- These log messages would normally go to the USER_FILE log, but they 
belong in the APP_FILE -->
+    <logger name="org.apache.nifi.web.security.requests" level="INFO" 
additivity="false">
+        <appender-ref ref="APP_FILE"/>
+    </logger>
+
     <!--
         Logger for capturing user events. We do not want to propagate these
         log events to the root logger. These messages are only sent to the
@@ -148,10 +171,17 @@
     <logger name="org.apache.nifi.web.api.AccessResource" level="INFO" 
additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
-    <logger name="org.apache.nifi.web.api" level="DEBUG" additivity="false">
+    <logger name="org.springframework.security.saml.log" level="WARN" 
additivity="false">
+        <appender-ref ref="USER_FILE"/>
+    </logger>
+    <logger name="org.opensaml" level="WARN" additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
 
+    <!-- Web Server Request Log -->
+    <logger name="org.apache.nifi.web.server.RequestLog" level="INFO" 
additivity="false">
+        <appender-ref ref="REQUEST_FILE"/>
+    </logger>
 
     <!--
         Logger for capturing Bootstrap logs and NiFi's standard error and 
standard out.
@@ -174,9 +204,8 @@
         <appender-ref ref="BOOTSTRAP_FILE" />
     </logger>
 
-
     <root level="INFO">
-        <appender-ref ref="APP_FILE"/>
+        <appender-ref ref="APP_FILE" />
     </root>
 
-</configuration>
\ No newline at end of file
+</configuration>
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/logback.xml
 
b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/logback.xml
index a9cdb26..c9bc033 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/logback.xml
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/logback.xml
@@ -57,6 +57,17 @@
         </encoder>
     </appender>
 
+    <appender name="REQUEST_FILE" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
+        
<file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-request.log</file>
+        <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            
<fileNamePattern>${org.apache.nifi.bootstrap.config.log.dir}/nifi-request_%d.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%msg%n</pattern>
+        </encoder>
+    </appender>
+
     <appender name="BOOTSTRAP_FILE" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
         
<file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-bootstrap.log</file>
         <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -82,25 +93,22 @@
     </appender>
 
     <!-- valid logging levels: TRACE, DEBUG, INFO, WARN, ERROR -->
+
     <logger name="org.apache.nifi" level="INFO"/>
     <logger name="org.apache.nifi.processors" level="INFO"/>
     <logger name="org.apache.nifi.processors.standard.LogAttribute" 
level="INFO"/>
     <logger name="org.apache.nifi.processors.standard.LogMessage" 
level="INFO"/>
     <logger 
name="org.apache.nifi.controller.repository.StandardProcessSession" 
level="WARN" />
-    <logger name="org.apache.nifi.connectable.LocalPort" level="DEBUG"/>
-    <logger 
name="org.apache.nifi.web.util.ClusterReplicationComponentLifecycle" 
level="DEBUG" />
-    <logger name="org.apache.nifi.groups.AbstractComponentScheduler" 
level="DEBUG" />
 
-    <logger name="org.apache.nifi.controller.XmlFlowSynchronizer" 
level="DEBUG" />
-    <logger name="org.apache.nifi.controller.inheritance" level="DEBUG" />
-    <logger 
name="org.apache.nifi.controller.serialization.VersionedFlowSynchronizer" 
level="DEBUG" />
 
     <logger name="org.apache.zookeeper.ClientCnxn" level="ERROR" />
     <logger name="org.apache.zookeeper.server.NIOServerCnxn" level="ERROR" />
     <logger name="org.apache.zookeeper.server.NIOServerCnxnFactory" 
level="ERROR" />
+    <logger name="org.apache.zookeeper.server.NettyServerCnxnFactory" 
level="ERROR" />
     <logger name="org.apache.zookeeper.server.quorum" level="ERROR" />
     <logger name="org.apache.zookeeper.ZooKeeper" level="ERROR" />
     <logger name="org.apache.zookeeper.server.PrepRequestProcessor" 
level="ERROR" />
+    <logger name="org.apache.nifi.controller.reporting.LogComponentStatuses" 
level="ERROR" />
 
     <logger name="org.apache.calcite.runtime.CalciteException" level="OFF" />
 
@@ -132,6 +140,17 @@
     <!-- Suppress non-error messages from SMBJ which was emitting large 
amounts of INFO logs by default -->
     <logger name="com.hierynomus.smbj" level="WARN" />
 
+    <!-- Suppress non-error messages from AWS KCL which was emitting large 
amounts of INFO logs by default -->
+    <logger name="com.amazonaws.services.kinesis" level="WARN" />
+
+    <!-- Suppress non-error messages from Apache Atlas which was emitting 
large amounts of INFO logs by default -->
+    <logger name="org.apache.atlas" level="WARN"/>
+
+    <!-- These log messages would normally go to the USER_FILE log, but they 
belong in the APP_FILE -->
+    <logger name="org.apache.nifi.web.security.requests" level="INFO" 
additivity="false">
+        <appender-ref ref="APP_FILE"/>
+    </logger>
+
     <!--
         Logger for capturing user events. We do not want to propagate these
         log events to the root logger. These messages are only sent to the
@@ -152,10 +171,17 @@
     <logger name="org.apache.nifi.web.api.AccessResource" level="INFO" 
additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
-    <logger name="org.apache.nifi.web.api" level="DEBUG" additivity="false">
+    <logger name="org.springframework.security.saml.log" level="WARN" 
additivity="false">
+        <appender-ref ref="USER_FILE"/>
+    </logger>
+    <logger name="org.opensaml" level="WARN" additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
 
+    <!-- Web Server Request Log -->
+    <logger name="org.apache.nifi.web.server.RequestLog" level="INFO" 
additivity="false">
+        <appender-ref ref="REQUEST_FILE"/>
+    </logger>
 
     <!--
         Logger for capturing Bootstrap logs and NiFi's standard error and 
standard out.
@@ -178,9 +204,8 @@
         <appender-ref ref="BOOTSTRAP_FILE" />
     </logger>
 
-
     <root level="INFO">
-        <appender-ref ref="APP_FILE"/>
+        <appender-ref ref="APP_FILE" />
     </root>
 
-</configuration>
\ No newline at end of file
+</configuration>
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/logback.xml
 
b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/logback.xml
index c42b3be..c9bc033 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/logback.xml
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/logback.xml
@@ -57,6 +57,17 @@
         </encoder>
     </appender>
 
+    <appender name="REQUEST_FILE" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
+        
<file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-request.log</file>
+        <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            
<fileNamePattern>${org.apache.nifi.bootstrap.config.log.dir}/nifi-request_%d.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%msg%n</pattern>
+        </encoder>
+    </appender>
+
     <appender name="BOOTSTRAP_FILE" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
         
<file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-bootstrap.log</file>
         <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -82,20 +93,22 @@
     </appender>
 
     <!-- valid logging levels: TRACE, DEBUG, INFO, WARN, ERROR -->
-    <logger name="org.apache.nifi.web.util.LocalComponentLifecycle" 
level="DEBUG" />
+
     <logger name="org.apache.nifi" level="INFO"/>
     <logger name="org.apache.nifi.processors" level="INFO"/>
     <logger name="org.apache.nifi.processors.standard.LogAttribute" 
level="INFO"/>
     <logger name="org.apache.nifi.processors.standard.LogMessage" 
level="INFO"/>
     <logger 
name="org.apache.nifi.controller.repository.StandardProcessSession" 
level="WARN" />
-    <logger name="org.apache.nifi.connectable.LocalPort" level="DEBUG"/>
+
 
     <logger name="org.apache.zookeeper.ClientCnxn" level="ERROR" />
     <logger name="org.apache.zookeeper.server.NIOServerCnxn" level="ERROR" />
     <logger name="org.apache.zookeeper.server.NIOServerCnxnFactory" 
level="ERROR" />
+    <logger name="org.apache.zookeeper.server.NettyServerCnxnFactory" 
level="ERROR" />
     <logger name="org.apache.zookeeper.server.quorum" level="ERROR" />
     <logger name="org.apache.zookeeper.ZooKeeper" level="ERROR" />
     <logger name="org.apache.zookeeper.server.PrepRequestProcessor" 
level="ERROR" />
+    <logger name="org.apache.nifi.controller.reporting.LogComponentStatuses" 
level="ERROR" />
 
     <logger name="org.apache.calcite.runtime.CalciteException" level="OFF" />
 
@@ -127,6 +140,17 @@
     <!-- Suppress non-error messages from SMBJ which was emitting large 
amounts of INFO logs by default -->
     <logger name="com.hierynomus.smbj" level="WARN" />
 
+    <!-- Suppress non-error messages from AWS KCL which was emitting large 
amounts of INFO logs by default -->
+    <logger name="com.amazonaws.services.kinesis" level="WARN" />
+
+    <!-- Suppress non-error messages from Apache Atlas which was emitting 
large amounts of INFO logs by default -->
+    <logger name="org.apache.atlas" level="WARN"/>
+
+    <!-- These log messages would normally go to the USER_FILE log, but they 
belong in the APP_FILE -->
+    <logger name="org.apache.nifi.web.security.requests" level="INFO" 
additivity="false">
+        <appender-ref ref="APP_FILE"/>
+    </logger>
+
     <!--
         Logger for capturing user events. We do not want to propagate these
         log events to the root logger. These messages are only sent to the
@@ -147,7 +171,17 @@
     <logger name="org.apache.nifi.web.api.AccessResource" level="INFO" 
additivity="false">
         <appender-ref ref="USER_FILE"/>
     </logger>
+    <logger name="org.springframework.security.saml.log" level="WARN" 
additivity="false">
+        <appender-ref ref="USER_FILE"/>
+    </logger>
+    <logger name="org.opensaml" level="WARN" additivity="false">
+        <appender-ref ref="USER_FILE"/>
+    </logger>
 
+    <!-- Web Server Request Log -->
+    <logger name="org.apache.nifi.web.server.RequestLog" level="INFO" 
additivity="false">
+        <appender-ref ref="REQUEST_FILE"/>
+    </logger>
 
     <!--
         Logger for capturing Bootstrap logs and NiFi's standard error and 
standard out.
@@ -170,9 +204,8 @@
         <appender-ref ref="BOOTSTRAP_FILE" />
     </logger>
 
-
     <root level="INFO">
-        <appender-ref ref="APP_FILE"/>
+        <appender-ref ref="APP_FILE" />
     </root>
 
-</configuration>
\ No newline at end of file
+</configuration>

Reply via email to