This is an automated email from the ASF dual-hosted git repository.
mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new deea4d4 Make KeyProvider plugins injectable
deea4d4 is described below
commit deea4d46f6bbe1081f1fdfc961ac7c672ec5eadf
Author: Matt Sicker <[email protected]>
AuthorDate: Sun Mar 27 20:57:53 2022 -0500
Make KeyProvider plugins injectable
Signed-off-by: Matt Sicker <[email protected]>
---
.../logging/log4j/core/util/SecretKeyProvider.java | 8 +++
.../log4j/flume/appender/FlumeAppender.java | 74 +++++++++++-----------
.../flume/appender/FlumePersistentManager.java | 30 +++++----
.../log4j/flume/appender/FlumeAppenderTest.java | 47 ++++++++------
.../logging/log4j/flume/test/FlumeKeyProvider.java | 8 +--
5 files changed, 94 insertions(+), 73 deletions(-)
diff --git
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
index 3f38f87..58dae4b 100644
---
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
+++
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
@@ -16,6 +16,10 @@
*/
package org.apache.logging.log4j.core.util;
+import org.apache.logging.log4j.plugins.Named;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+
import javax.crypto.SecretKey;
/**
@@ -23,6 +27,10 @@ import javax.crypto.SecretKey;
*/
public interface SecretKeyProvider {
+ String CATEGORY = "KeyProvider";
+
+ Key<PluginManager> PLUGIN_MANAGER_KEY = new @Named(CATEGORY) Key<>() {};
+
/**
* Returns this SecretKey.
*
diff --git
a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
index c2e7a2e..33a12ea 100644
---
a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
+++
b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
@@ -16,27 +16,28 @@
*/
package org.apache.logging.log4j.flume.appender;
-import java.io.Serializable;
-import java.util.Locale;
-import java.util.concurrent.TimeUnit;
-
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
+import org.apache.logging.log4j.core.layout.Rfc5424Layout;
+import org.apache.logging.log4j.core.net.Facility;
+import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.core.util.Integers;
import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.plugins.PluginAliases;
import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.core.layout.Rfc5424Layout;
-import org.apache.logging.log4j.core.net.Facility;
-import org.apache.logging.log4j.core.util.Booleans;
-import org.apache.logging.log4j.core.util.Integers;
+import org.apache.logging.log4j.plugins.di.Injector;
import org.apache.logging.log4j.util.Timer;
+import java.io.Serializable;
+import java.util.Locale;
+import java.util.concurrent.TimeUnit;
+
/**
* An Appender that uses the Avro protocol to route events to Flume.
*/
@@ -181,36 +182,37 @@ public final class FlumeAppender extends AbstractAppender
implements FlumeEventF
* @param factory The factory to use to create Flume events.
* @param layout The layout to format the event.
* @param filter A Filter to filter events.
- *
* @return A Flume Avro Appender.
*/
@PluginFactory
- public static FlumeAppender createAppender(@PluginElement final Agent[]
agents,
- @PluginElement final Property[]
properties,
- @PluginAttribute final String
hosts,
- @PluginAttribute final String
embedded,
- @PluginAttribute final String
type,
- @PluginAttribute final String
dataDir,
- @PluginAliases("connectTimeout")
-
@PluginAttribute("connectTimeoutMillis") final String connectionTimeoutMillis,
- @PluginAliases("requestTimeout")
- @PluginAttribute final String
requestTimeoutMillis,
- @PluginAttribute final String
agentRetries,
- @PluginAliases("maxDelay") //
deprecated
- @PluginAttribute final String
maxDelayMillis,
- @PluginAttribute final String
name,
-
@PluginAttribute("ignoreExceptions") final String ignore,
- @PluginAttribute("mdcExcludes")
final String excludes,
- @PluginAttribute("mdcIncludes")
final String includes,
- @PluginAttribute("mdcRequired")
final String required,
- @PluginAttribute final String
mdcPrefix,
- @PluginAttribute final String
eventPrefix,
- @PluginAttribute("compress")
final String compressBody,
- @PluginAttribute final String
batchSize,
- @PluginAttribute final String
lockTimeoutRetries,
- @PluginElement final
FlumeEventFactory factory,
- @PluginElement Layout<? extends
Serializable> layout,
- @PluginElement final Filter
filter) {
+ public static FlumeAppender createAppender(
+ @PluginElement final Agent[] agents,
+ @PluginElement final Property[] properties,
+ @PluginAttribute final String hosts,
+ @PluginAttribute final String embedded,
+ @PluginAttribute final String type,
+ @PluginAttribute final String dataDir,
+ @PluginAliases("connectTimeout")
+ @PluginAttribute("connectTimeoutMillis") final String
connectionTimeoutMillis,
+ @PluginAliases("requestTimeout")
+ @PluginAttribute final String requestTimeoutMillis,
+ @PluginAttribute final String agentRetries,
+ @PluginAliases("maxDelay") // deprecated
+ @PluginAttribute final String maxDelayMillis,
+ @PluginAttribute final String name,
+ @PluginAttribute("ignoreExceptions") final String ignore,
+ @PluginAttribute("mdcExcludes") final String excludes,
+ @PluginAttribute("mdcIncludes") final String includes,
+ @PluginAttribute("mdcRequired") final String required,
+ @PluginAttribute final String mdcPrefix,
+ @PluginAttribute final String eventPrefix,
+ @PluginAttribute("compress") final String compressBody,
+ @PluginAttribute final String batchSize,
+ @PluginAttribute final String lockTimeoutRetries,
+ @PluginElement final FlumeEventFactory factory,
+ @PluginElement Layout<? extends Serializable> layout,
+ @PluginElement final Filter filter,
+ final Injector injector) {
final boolean embed = embedded != null ?
Boolean.parseBoolean(embedded) :
(agents == null || agents.length == 0 || hosts == null ||
hosts.isEmpty()) && properties != null && properties.length > 0;
@@ -271,7 +273,7 @@ public final class FlumeAppender extends AbstractAppender
implements FlumeEventF
break;
case PERSISTENT:
manager = FlumePersistentManager.getManager(name,
getAgents(agents, hosts), properties, batchCount, retries,
- connectTimeoutMillis, reqTimeoutMillis, delayMillis,
lockTimeoutRetryCount, dataDir);
+ connectTimeoutMillis, reqTimeoutMillis, delayMillis,
lockTimeoutRetryCount, dataDir, injector);
break;
default:
LOGGER.debug("No manager type specified. Defaulting to AVRO");
diff --git
a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
index 8219779..b802f0c 100644
---
a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
+++
b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
@@ -38,8 +38,9 @@ import org.apache.logging.log4j.core.util.FileUtils;
import org.apache.logging.log4j.core.util.Log4jThread;
import org.apache.logging.log4j.core.util.Log4jThreadFactory;
import org.apache.logging.log4j.core.util.SecretKeyProvider;
+import org.apache.logging.log4j.plugins.di.Injector;
+import org.apache.logging.log4j.plugins.util.PluginManager;
import org.apache.logging.log4j.plugins.util.PluginType;
-import org.apache.logging.log4j.plugins.util.PluginUtil;
import org.apache.logging.log4j.util.Strings;
import javax.crypto.Cipher;
@@ -141,11 +142,10 @@ public class FlumePersistentManager extends
FlumeAvroManager {
* @param dataDir The location of the Berkeley database.
* @return A FlumeAvroManager.
*/
- public static FlumePersistentManager getManager(final String name, final
Agent[] agents,
- final Property[]
properties, int batchSize, final int retries,
- final int
connectionTimeout, final int requestTimeout,
- final int delayMillis,
final int lockTimeoutRetryCount,
- final String dataDir) {
+ public static FlumePersistentManager getManager(
+ final String name, final Agent[] agents, final Property[]
properties, int batchSize, final int retries,
+ final int connectionTimeout, final int requestTimeout, final int
delayMillis, final int lockTimeoutRetryCount,
+ final String dataDir, final Injector injector) {
if (agents == null || agents.length == 0) {
throw new IllegalArgumentException("At least one agent is
required");
}
@@ -167,7 +167,7 @@ public class FlumePersistentManager extends
FlumeAvroManager {
sb.append(']');
sb.append(' ').append(dataDirectory);
return getManager(sb.toString(), factory, new FactoryData(name,
agents, batchSize, retries,
- connectionTimeout, requestTimeout, delayMillis,
lockTimeoutRetryCount, dataDir, properties));
+ connectionTimeout, requestTimeout, delayMillis,
lockTimeoutRetryCount, dataDir, properties, injector));
}
@Override
@@ -344,6 +344,7 @@ public class FlumePersistentManager extends
FlumeAvroManager {
private final int delayMillis;
private final int lockTimeoutRetryCount;
private final Property[] properties;
+ private final Injector injector;
/**
* Constructor.
@@ -352,9 +353,11 @@ public class FlumePersistentManager extends
FlumeAvroManager {
* @param batchSize The number of events to include in a batch.
* @param dataDir The directory for data.
*/
- public FactoryData(final String name, final Agent[] agents, final int
batchSize, final int retries,
- final int connectionTimeout, final int
requestTimeout, final int delayMillis,
- final int lockTimeoutRetryCount, final String
dataDir, final Property[] properties) {
+ public FactoryData(
+ final String name, final Agent[] agents, final int batchSize,
final int retries,
+ final int connectionTimeout, final int requestTimeout, final
int delayMillis,
+ final int lockTimeoutRetryCount, final String dataDir, final
Property[] properties,
+ final Injector injector) {
this.name = name;
this.agents = agents;
this.batchSize = batchSize;
@@ -365,6 +368,7 @@ public class FlumePersistentManager extends
FlumeAvroManager {
this.delayMillis = delayMillis;
this.lockTimeoutRetryCount = lockTimeoutRetryCount;
this.properties = properties;
+ this.injector = injector;
}
}
@@ -429,7 +433,9 @@ public class FlumePersistentManager extends
FlumeAvroManager {
}
}
if (key != null) {
- final Map<String, PluginType<?>> plugins =
PluginUtil.collectPluginsByCategory("KeyProvider");
+ final PluginManager pluginManager =
data.injector.getInstance(SecretKeyProvider.PLUGIN_MANAGER_KEY);
+ pluginManager.collectPlugins();
+ final Map<String, PluginType<?>> plugins =
pluginManager.getPlugins();
if (plugins != null) {
boolean found = false;
for (final Map.Entry<String, PluginType<?>> entry :
plugins.entrySet()) {
@@ -437,7 +443,7 @@ public class FlumePersistentManager extends
FlumeAvroManager {
found = true;
final Class<?> cl =
entry.getValue().getPluginClass();
try {
- final SecretKeyProvider provider =
(SecretKeyProvider) cl.newInstance();
+ final SecretKeyProvider provider =
data.injector.getInstance(cl.asSubclass(SecretKeyProvider.class));
secretKey = provider.getSecretKey();
LOGGER.debug("Persisting events using
SecretKeyProvider {}", cl.getName());
} catch (final Exception ex) {
diff --git
a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
index 95c9c56..401f6d5 100644
---
a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
+++
b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
@@ -16,16 +16,6 @@
*/
package org.apache.logging.log4j.flume.appender;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.zip.GZIPInputStream;
-
import org.apache.flume.Channel;
import org.apache.flume.ChannelException;
import org.apache.flume.ChannelSelector;
@@ -45,15 +35,27 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.test.AvailablePortFinder;
import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.apache.logging.log4j.plugins.di.DI;
+import org.apache.logging.log4j.plugins.di.Injector;
import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.core.test.AvailablePortFinder;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.zip.GZIPInputStream;
+
/**
*
*/
@@ -63,6 +65,7 @@ public class FlumeAppenderTest {
private Channel channel;
private Logger avroLogger;
private String testPort;
+ private Injector injector;
@BeforeClass
public static void setupClass() {
@@ -71,6 +74,8 @@ public class FlumeAppenderTest {
@Before
public void setUp() throws Exception {
+ injector = DI.createInjector();
+ injector.init();
eventSource = new AvroSource();
channel = new MemoryChannel();
@@ -121,7 +126,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, null, null, "true", "1",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -149,7 +154,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(null,
null, hosts, "false", "Avro", null, "1000", "1000", "1",
"1000",
"avro", "false", null, null, null, null, null, "true", "1",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -178,7 +183,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, "ReqCtx_", null, "true",
- "1", null, null, null, null);
+ "1", null, null, null, null, injector);
avroAppender.start();
final Logger eventLogger = (Logger)
LogManager.getLogger("EventLogger");
Assert.assertNotNull(eventLogger);
@@ -217,7 +222,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, null, null, "true", "1",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -252,7 +257,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "500",
"avro", "false", null, null, null, null, null, "true", "10",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -292,7 +297,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "500",
"avro", "false", null, null, null, null, null, "true", "10",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -326,7 +331,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, null, null, "true", "10",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -360,7 +365,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, null, null, "true", "1",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
@@ -390,7 +395,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, null, null, "true", "1",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
Assert.assertTrue("Appender Not started", avroAppender.isStarted());
avroLogger.addAppender(avroAppender);
@@ -438,7 +443,7 @@ public class FlumeAppenderTest {
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, null, null, "true", "1",
- null, null, null, null);
+ null, null, null, null, injector);
avroAppender.start();
avroLogger.addAppender(avroAppender);
avroLogger.setLevel(Level.ALL);
diff --git
a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
index b288cdf..e680f19 100644
---
a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
+++
b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
@@ -16,16 +16,16 @@
*/
package org.apache.logging.log4j.flume.test;
+import org.apache.logging.log4j.core.util.SecretKeyProvider;
+import org.apache.logging.log4j.plugins.Plugin;
+
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
-import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.core.util.SecretKeyProvider;
-
/**
*
*/
-@Plugin(name = "FlumeKeyProvider", category = "KeyProvider", elementType =
"SecretKeyProvider", printObject = true)
+@Plugin(name = "FlumeKeyProvider", category = SecretKeyProvider.CATEGORY,
elementType = "SecretKeyProvider", printObject = true)
public class FlumeKeyProvider implements SecretKeyProvider {
private static final byte[] key = new byte[] {-7, -21, -118, -25, -79, 73,
72, -64, 0, 127, -93, -13, -38,