NIFI-1724 Added properties to configure log level when file not found and permission denied on FetchFile processor
NIFI-1724 Added unit test for logging with level This closes #348 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/3a7a4393 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/3a7a4393 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/3a7a4393 Branch: refs/heads/NIFI-1654 Commit: 3a7a43930f8f55c2bd3ea69943ae7e139c1e8062 Parents: 2859cd2 Author: Pierre Villard <[email protected]> Authored: Wed Apr 13 14:21:43 2016 +0200 Committer: Oleg Zhurakousky <[email protected]> Committed: Mon Apr 18 08:55:17 2016 -0400 ---------------------------------------------------------------------- .../org/apache/nifi/logging/ComponentLog.java | 8 ++ .../org/apache/nifi/util/MockProcessorLog.java | 89 ++++++++++++++++++++ .../documentation/mock/MockProcessorLogger.java | 89 ++++++++++++++++++++ .../nifi/processor/SimpleProcessLogger.java | 88 +++++++++++++++++++ .../nifi/processor/TestSimpleProcessLogger.java | 13 +++ .../nifi/processors/standard/FetchFile.java | 23 ++++- 6 files changed, 308 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/3a7a4393/nifi-api/src/main/java/org/apache/nifi/logging/ComponentLog.java ---------------------------------------------------------------------- diff --git a/nifi-api/src/main/java/org/apache/nifi/logging/ComponentLog.java b/nifi-api/src/main/java/org/apache/nifi/logging/ComponentLog.java index 1710b19..fe9fb2d 100644 --- a/nifi-api/src/main/java/org/apache/nifi/logging/ComponentLog.java +++ b/nifi-api/src/main/java/org/apache/nifi/logging/ComponentLog.java @@ -101,4 +101,12 @@ public interface ComponentLog { void debug(String msg, Object[] os, Throwable t); void debug(String msg); + + void log(LogLevel level, String msg, Throwable t); + + void log(LogLevel level, String msg, Object[] os); + + void log(LogLevel level, String msg); + + void log(LogLevel level, String msg, Object[] os, Throwable t); } http://git-wip-us.apache.org/repos/asf/nifi/blob/3a7a4393/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java index ae79647..cb87e50 100644 --- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java +++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java @@ -18,6 +18,7 @@ package org.apache.nifi.util; import java.util.List; +import org.apache.nifi.logging.LogLevel; import org.apache.nifi.logging.ProcessorLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -310,4 +311,92 @@ public class MockProcessorLog implements ProcessorLog { logger.debug(msg, os); } + @Override + public void log(LogLevel level, String msg, Throwable t) { + switch (level) { + case DEBUG: + debug(msg, t); + break; + case ERROR: + case FATAL: + error(msg, t); + break; + case INFO: + info(msg, t); + break; + case TRACE: + trace(msg, t); + break; + case WARN: + warn(msg, t); + break; + } + } + + @Override + public void log(LogLevel level, String msg, Object[] os) { + switch (level) { + case DEBUG: + debug(msg, os); + break; + case ERROR: + case FATAL: + error(msg, os); + break; + case INFO: + info(msg, os); + break; + case TRACE: + trace(msg, os); + break; + case WARN: + warn(msg, os); + break; + } + } + + @Override + public void log(LogLevel level, String msg) { + switch (level) { + case DEBUG: + debug(msg); + break; + case ERROR: + case FATAL: + error(msg); + break; + case INFO: + info(msg); + break; + case TRACE: + trace(msg); + break; + case WARN: + warn(msg); + break; + } + } + + @Override + public void log(LogLevel level, String msg, Object[] os, Throwable t) { + switch (level) { + case DEBUG: + debug(msg, os, t); + break; + case ERROR: + case FATAL: + error(msg, os, t); + break; + case INFO: + info(msg, os, t); + break; + case TRACE: + trace(msg, os, t); + break; + case WARN: + warn(msg, os, t); + break; + } + } + } http://git-wip-us.apache.org/repos/asf/nifi/blob/3a7a4393/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/mock/MockProcessorLogger.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/mock/MockProcessorLogger.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/mock/MockProcessorLogger.java index f91e87c..8cdd90a 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/mock/MockProcessorLogger.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/mock/MockProcessorLogger.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.documentation.mock; +import org.apache.nifi.logging.LogLevel; import org.apache.nifi.logging.ProcessorLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -166,4 +167,92 @@ public class MockProcessorLogger implements ProcessorLog { public void debug(String msg) { logger.debug(msg); } + + @Override + public void log(LogLevel level, String msg, Throwable t) { + switch (level) { + case DEBUG: + debug(msg, t); + break; + case ERROR: + case FATAL: + error(msg, t); + break; + case INFO: + info(msg, t); + break; + case TRACE: + trace(msg, t); + break; + case WARN: + warn(msg, t); + break; + } + } + + @Override + public void log(LogLevel level, String msg, Object[] os) { + switch (level) { + case DEBUG: + debug(msg, os); + break; + case ERROR: + case FATAL: + error(msg, os); + break; + case INFO: + info(msg, os); + break; + case TRACE: + trace(msg, os); + break; + case WARN: + warn(msg, os); + break; + } + } + + @Override + public void log(LogLevel level, String msg) { + switch (level) { + case DEBUG: + debug(msg); + break; + case ERROR: + case FATAL: + error(msg); + break; + case INFO: + info(msg); + break; + case TRACE: + trace(msg); + break; + case WARN: + warn(msg); + break; + } + } + + @Override + public void log(LogLevel level, String msg, Object[] os, Throwable t) { + switch (level) { + case DEBUG: + debug(msg, os, t); + break; + case ERROR: + case FATAL: + error(msg, os, t); + break; + case INFO: + info(msg, os, t); + break; + case TRACE: + trace(msg, os, t); + break; + case WARN: + warn(msg, os, t); + break; + } + } } http://git-wip-us.apache.org/repos/asf/nifi/blob/3a7a4393/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java index 25928f1..a8c5069 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java @@ -373,4 +373,92 @@ public class SimpleProcessLogger implements ProcessorLog { logRepository.addLogMessage(LogLevel.DEBUG, msg, os); } + @Override + public void log(LogLevel level, String msg, Throwable t) { + switch (level) { + case DEBUG: + debug(msg, t); + break; + case ERROR: + case FATAL: + error(msg, t); + break; + case INFO: + info(msg, t); + break; + case TRACE: + trace(msg, t); + break; + case WARN: + warn(msg, t); + break; + } + } + + @Override + public void log(LogLevel level, String msg, Object[] os) { + switch (level) { + case DEBUG: + debug(msg, os); + break; + case ERROR: + case FATAL: + error(msg, os); + break; + case INFO: + info(msg, os); + break; + case TRACE: + trace(msg, os); + break; + case WARN: + warn(msg, os); + break; + } + } + + @Override + public void log(LogLevel level, String msg) { + switch (level) { + case DEBUG: + debug(msg); + break; + case ERROR: + case FATAL: + error(msg); + break; + case INFO: + info(msg); + break; + case TRACE: + trace(msg); + break; + case WARN: + warn(msg); + break; + } + } + + @Override + public void log(LogLevel level, String msg, Object[] os, Throwable t) { + switch (level) { + case DEBUG: + debug(msg, os, t); + break; + case ERROR: + case FATAL: + error(msg, os, t); + break; + case INFO: + info(msg, os, t); + break; + case TRACE: + trace(msg, os, t); + break; + case WARN: + warn(msg, os, t); + break; + } + } + } http://git-wip-us.apache.org/repos/asf/nifi/blob/3a7a4393/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java index 441d7d0..2abb29f 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.when; import java.lang.reflect.Field; +import org.apache.nifi.logging.LogLevel; import org.apache.nifi.reporting.ReportingTask; import org.junit.Before; import org.junit.Test; @@ -91,6 +92,18 @@ public class TestSimpleProcessLogger { verify(logger, times(1)).warn(anyString(), argThat(new MyVarargMatcher())); } + @Test + public void validateDelegateLoggerReceivesThrowableToStringOnLogWithLevel() { + componentLog.log(LogLevel.WARN, "Hello {}", e); + verify(logger, times(1)).warn(anyString(), argThat(new MyVarargMatcher())); + componentLog.log(LogLevel.ERROR, "Hello {}", e); + verify(logger, times(1)).error(anyString(), argThat(new MyVarargMatcher())); + componentLog.log(LogLevel.INFO, "Hello {}", e); + verify(logger, times(1)).info(anyString(), argThat(new MyVarargMatcher())); + componentLog.log(LogLevel.TRACE, "Hello {}", e); + verify(logger, times(1)).trace(anyString(), argThat(new MyVarargMatcher())); + } + /** * */ http://git-wip-us.apache.org/repos/asf/nifi/blob/3a7a4393/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchFile.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchFile.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchFile.java index e0f9bbd..9d13d5b 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchFile.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchFile.java @@ -43,6 +43,7 @@ import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.components.ValidationContext; import org.apache.nifi.components.ValidationResult; import org.apache.nifi.flowfile.FlowFile; +import org.apache.nifi.logging.LogLevel; import org.apache.nifi.processor.AbstractProcessor; import org.apache.nifi.processor.ProcessContext; import org.apache.nifi.processor.ProcessSession; @@ -100,6 +101,20 @@ public class FetchFile extends AbstractProcessor { .defaultValue(CONFLICT_RENAME.getValue()) .required(true) .build(); + static final PropertyDescriptor FILE_NOT_FOUND_LOG_LEVEL = new PropertyDescriptor.Builder() + .name("Log level when file not found") + .description("Log level to use in case the file does not exist when the processor is trigerred") + .allowableValues(LogLevel.values()) + .defaultValue(LogLevel.ERROR.toString()) + .required(true) + .build(); + static final PropertyDescriptor PERM_DENIED_LOG_LEVEL = new PropertyDescriptor.Builder() + .name("Log level when permission denied") + .description("Log level to use in case user " + System.getProperty("user.name") + " does not have sufficient permissions to read the file") + .allowableValues(LogLevel.values()) + .defaultValue(LogLevel.ERROR.toString()) + .required(true) + .build(); static final Relationship REL_SUCCESS = new Relationship.Builder() .name("success") @@ -126,6 +141,8 @@ public class FetchFile extends AbstractProcessor { properties.add(COMPLETION_STRATEGY); properties.add(MOVE_DESTINATION_DIR); properties.add(CONFLICT_STRATEGY); + properties.add(FILE_NOT_FOUND_LOG_LEVEL); + properties.add(PERM_DENIED_LOG_LEVEL); return properties; } @@ -162,11 +179,13 @@ public class FetchFile extends AbstractProcessor { final StopWatch stopWatch = new StopWatch(true); final String filename = context.getProperty(FILENAME).evaluateAttributeExpressions(flowFile).getValue(); + final LogLevel levelFileNotFound = LogLevel.valueOf(context.getProperty(FILE_NOT_FOUND_LOG_LEVEL).getValue()); + final LogLevel levelPermDenied = LogLevel.valueOf(context.getProperty(PERM_DENIED_LOG_LEVEL).getValue()); final File file = new File(filename); // Verify that file exists if (!file.exists()) { - getLogger().error("Could not fetch file {} from file system for {} because the file does not exist; routing to not.found", new Object[] {file, flowFile}); + getLogger().log(levelFileNotFound, "Could not fetch file {} from file system for {} because the file does not exist; routing to not.found", new Object[] {file, flowFile}); session.getProvenanceReporter().route(flowFile, REL_NOT_FOUND); session.transfer(session.penalize(flowFile), REL_NOT_FOUND); return; @@ -175,7 +194,7 @@ public class FetchFile extends AbstractProcessor { // Verify read permission on file final String user = System.getProperty("user.name"); if (!isReadable(file)) { - getLogger().error("Could not fetch file {} from file system for {} due to user {} not having sufficient permissions to read the file; routing to permission.denied", + getLogger().log(levelPermDenied, "Could not fetch file {} from file system for {} due to user {} not having sufficient permissions to read the file; routing to permission.denied", new Object[] {file, flowFile, user}); session.getProvenanceReporter().route(flowFile, REL_PERMISSION_DENIED); session.transfer(session.penalize(flowFile), REL_PERMISSION_DENIED);
