For one, you’ll need to annotate your constructor arguments with the 
appropriate @Plugin annotations (@PluginElement and @PluginAttribute mainly) to 
know how to bind config data to your plugin. That is required regardless of 
whether you’re manually generating the metadata file for plugin descriptors 
(which is mainly used as a sort of component index to avoid classpath scanning 
at runtime).

While I do recommend the annotation processor, at least in 2.x, that was 
written to replace a main() method in a class somewhere you could invoke that 
generated the same metadata, and said metadata was used to avoid the need for 
specifying package names to scan at runtime in your config file to find custom 
plugins (something that bothered me personally in unit tests since we had test 
plugins to import everywhere). Due to strong encapsulation of Java modules, we 
had to abandon generic classpath scanning in 3.x, hence the need for the 
metadata file. I suppose this is something that’s not set in stone yet for 
3.0.0, so we can look more into this.

> On Nov 28, 2024, at 08:47, PavelTurk <pavelturk2...@gmail.com> wrote:
> 
> Hello everyone.
> 
> I am trying to create my own appender using JPMS service in 3.0.0-beta3. This 
> is my code:
> 
> 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.plugins.Configurable;
> import org.apache.logging.log4j.plugins.Plugin;
> 
> @Plugin("Foo")
> @Configurable(elementType = Appender.ELEMENT_TYPE, printObject = true)
> public class FooAppender extends AbstractAppender {
> 
>     public FooAppender(String name, Filter filter, Layout layout, boolean 
> ignoreExceptions, Property[] properties) {
>         super(name, filter, layout, ignoreExceptions, properties);
>     }
> 
>     @Override
>     public void append(LogEvent event) {
>         System.out.println("Event:" + event.getMessage());
>     }
> }
> 
> import org.apache.logging.log4j.plugins.model.PluginEntry;
> import org.apache.logging.log4j.plugins.model.PluginService;
> 
> public class PluginProvider extends PluginService {
> 
>     private static PluginEntry[] entries = new PluginEntry[] {
>         PluginEntry.builder()
>             .setKey("foo")
>             .setClassName("com.foo.FooAppender")
>             .setName("Foo")
>             .setNamespace("Core")//I tried to use my namespace - it didn't 
> help
>             .setElementType("appender")
>             .setPrintable(true)
>             .get(),
>     };
> 
>     @Override
>     public PluginEntry[] getEntries() {
>         System.out.println("ENTRIES OK"); // I didn't get this point
>         return entries;
>     }
> }
> 
> module-info:
> 
> opens com.foo;
> provides org.apache.logging.log4j.plugins.model.PluginService with 
> com.foo.PluginProvider;
> 
> Config:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration status="error" shutdownHook="disable">
>     <Appenders>
>          <Foo name="Foo"/>
>      </Appenders>
>     <Loggers>
>         <Root level="debug">
>             <AppenderRef ref="Foo"/>
>         </Root>
>    </Loggers>
> </Configuration>
> 
> Result:
> Exception in thread "main" 
> org.apache.logging.log4j.plugins.di.spi.ReflectionException
>     at 
> org.apache.logging.log4j.plugins@3.0.0.beta3/org.apache.logging.log4j.plugins.di.spi.ReflectionAgent.invokeMethod(ReflectionAgent.java:84)
>     at 
> org.apache.logging.log4j.plugins@3.0.0.beta3/org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$registerBundleMethod$13(DefaultInstanceFactory.java:306)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.util.LazyUtil$SafeLazy.value(LazyUtil.java:113)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.util.Lazy.get(Lazy.java:39)
>     at 
> org.apache.logging.log4j.plugins@3.0.0.beta3/org.apache.logging.log4j.plugins.di.InstanceFactory.getInstance(InstanceFactory.java:126)
>     at 
> org.apache.logging.log4j.plugins@3.0.0.beta3/org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$getArgumentFactory$9(DefaultInstanceFactory.java:223)
>     at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:212)
>     at 
> java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709)
>     at 
> java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:556)
>     at 
> java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:546)
>     at 
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:622)
>     at 
> java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:291)
>     at 
> java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:631)
>     at 
> java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:637)
>     at 
> org.apache.logging.log4j.plugins@3.0.0.beta3/org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$registerBundleMethod$13(DefaultInstanceFactory.java:305)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.util.LazyUtil$SafeLazy.value(LazyUtil.java:113)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.util.Lazy.get(Lazy.java:39)
>     at 
> org.apache.logging.log4j.plugins@3.0.0.beta3/org.apache.logging.log4j.plugins.di.InstanceFactory.getInstance(InstanceFactory.java:115)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:149)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.LoggerContext$Builder.build(LoggerContext.java:996)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.selector.AbstractContextSelector.createContext(AbstractContextSelector.java:42)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:231)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:149)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:132)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:126)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:151)
>     at 
> org.apache.logging.log4j.core@3.0.0.beta3/org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:49)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.LogManager.getContext(LogManager.java:138)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:136)
>     at 
> org.apache.logging.log4j.slf4j2.impl@2.24.1/org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:58)
>     at 
> org.apache.logging.log4j@2.24.1/org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
>     at 
> org.apache.logging.log4j.slf4j2.impl@2.24.1/org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:32)
>     at 
> org.slf4j@2.0.9/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:426)
>     at 
> org.slf4j@2.0.9/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:451)
> 
> So, java dies in main class where I initializer my logger.
> Could anyone say: 1) how to fix it 2) How to use custom Namespace for my 
> appender in configuration?
> For example, if I do PluginEntry.builder().setNamespace("FooNS")?
> 
> Best regards, Pavel
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
> For additional commands, e-mail: log4j-user-h...@logging.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-user-h...@logging.apache.org

Reply via email to