logging-log4j2
                                
                                 logging-log4j2 copied to clipboard
                                
                                    logging-log4j2 copied to clipboard
                            
                            
                            
                        Add record support for @Plugin annotation
Description
In log4j2 (ver 2.21.1), we can create custom appender plugins with nested elements.
Let's say we have the following log4j2.xml configuration:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Appenders>
        <MyAppender name="myAppender">
            <MessageTemplate prefix="Hello, " suffix="!"/>
        </MyAppender>
    </Appenders>
    <Loggers>
        <Root level="ALL">
            <AppenderRef ref="myAppender"/>
        </Root>
    </Loggers>
</Configuration>
MyAppender is a custom appender and MessageTemplate is a custom nested element.
A source code of MyAppender class:
@Plugin(name = "MyAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE)
public class MyAppender extends AbstractAppender {
    private final MessageTemplate messageTemplate;
    public MyAppender(String name, MessageTemplate messageTemplate) {
        super(name, null, PatternLayout.createDefaultLayout(), true, Property.EMPTY_ARRAY);
        this.messageTemplate = messageTemplate;
    }
    @PluginFactory
    public static MyAppender createAppender(@PluginAttribute("name") String name,
                                            @PluginElement("MessageTemplate") MessageTemplate messageTemplate) {
        return new MyAppender(name, messageTemplate);
    }
    @Override
    public void append(LogEvent event) {
        var prefix = messageTemplate.getPrefix();
        var formattedMessage = event.getMessage().getFormattedMessage();
        var suffix = messageTemplate.getSuffix();
        var text = prefix + formattedMessage + suffix;
        System.out.println(text);
    }
}
A source code of MessageTemplate class:
@Plugin(name = "MessageTemplate", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE)
public class MessageTemplate {
    private final String prefix;
    private final String suffix;
    public MessageTemplate(String prefix, String suffix) {
        this.prefix = prefix;
        this.suffix = suffix;
    }
    @PluginFactory
    public static MessageTemplate createAppender(@PluginAttribute("prefix") String prefix,
                                                 @PluginAttribute("suffix") String suffix) {
        return new MessageTemplate(prefix, suffix);
    }
    public String getPrefix() {
        return prefix;
    }
    public String getSuffix() {
        return suffix;
    }
}
Let's create a main class:
public class Log4j2Demo {
    private static final Logger LOGGER = LoggerFactory.getLogger(Log4j2Demo.class);
    public static void main(String[] args) {
        LOGGER.info("World");
    }
}
If we run the code above, we'll get the following output:
Hello, World!
Problem
If the project is developed with Java 17, you may think of making MessageTemplate a record:
@Plugin(name = "MessageTemplate", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE)
public record MessageTemplate(String prefix, String suffix) {
    @PluginFactory
    public static MessageTemplate createAppender(@PluginAttribute("prefix") String prefix,
                                                 @PluginAttribute("suffix") String suffix) {
        return new MessageTemplate(prefix, suffix);
    }
}
Now the code extremely clean. But if we run it now, we'll get the following error:
ERROR StatusConsoleListener MyAppender contains an invalid element or attribute "MessageTemplate"
ERROR StatusConsoleListener An exception occurred processing Appender myAppender
 java.lang.NullPointerException: Cannot invoke "com.github.yvasyliev.log4j2.appenders.MessageTemplate.prefix()" because "this.messageTemplate" is null
	at com.github.yvasyliev.log4j2.appenders.MyAppender.append(MyAppender.java:31)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:686)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:644)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:620)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:556)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:81)
	at org.apache.logging.log4j.core.Logger.log(Logger.java:163)
	at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2165)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2119)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2102)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1982)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1835)
	at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:174)
	at com.github.yvasyliev.log4j2.Log4j2Demo.main(Log4j2Demo.java:10)
Suggestion
My suggestion is to add support of Java records to Log4j 2 annotations so we can create clean plugin code.
This seems to work fine already in 3.0.0-beta1, though the annotations have changed a little.
This issue is stale because it has been waiting for your feedback for more than 60 days. The Apache Logging Services community values every submitted issue, but without additional information from you, we are unable to provide a solution to your problem. Please comment on this issue or it will be closed in 7 days.
I was trying to check 3.0.0-beta2 version, but got this error:
ERROR StatusConsoleListener Appenders contains an invalid element or attribute "MyAppender"
ERROR StatusConsoleListener Unable to locate appender "myAppender" for logger config "root"
Full log output
DEBUG StatusConsoleListener Starting LoggerContext[76ed5528] with configuration XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml]...
DEBUG StatusConsoleListener Shutdown hook enabled. Registering a new one.
DEBUG StatusConsoleListener Apache Log4j Core 3.0 initializing configuration XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml]
TRACE StatusConsoleListener Merged PluginNamespace[Core][appenderref] = PluginType [pluginClass=Lazy value not initialized, key=appenderref, elementType=AppenderRef, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][appender-ref] = PluginType [pluginClass=Lazy value not initialized, key=appender-ref, elementType=AppenderRef, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][appenders] = PluginType [pluginClass=Lazy value not initialized, key=appenders, elementType=appenders, isObjectPrintable=false, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][appenderset] = PluginType [pluginClass=Lazy value not initialized, key=appenderset, elementType=AppenderSet, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][arrayblockingqueue] = PluginType [pluginClass=Lazy value not initialized, key=arrayblockingqueue, elementType=BlockingQueueFactory, isObjectPrintable=false, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][async] = PluginType [pluginClass=Lazy value not initialized, key=async, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][burstfilter] = PluginType [pluginClass=Lazy value not initialized, key=burstfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][classarbiter] = PluginType [pluginClass=Lazy value not initialized, key=classarbiter, elementType=Arbiter, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][columnmapping] = PluginType [pluginClass=Lazy value not initialized, key=columnmapping, elementType=ColumnMapping, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][console] = PluginType [pluginClass=Lazy value not initialized, key=console, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][countingnoop] = PluginType [pluginClass=Lazy value not initialized, key=countingnoop, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][crontriggeringpolicy] = PluginType [pluginClass=Lazy value not initialized, key=crontriggeringpolicy, elementType=CronTriggeringPolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][customlevel] = PluginType [pluginClass=Lazy value not initialized, key=customlevel, elementType=CustomLevel, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][customlevels] = PluginType [pluginClass=Lazy value not initialized, key=customlevels, elementType=CustomLevels, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][default] = PluginType [pluginClass=Lazy value not initialized, key=default, elementType=advertiser, isObjectPrintable=false, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][defaultarbiter] = PluginType [pluginClass=Lazy value not initialized, key=defaultarbiter, elementType=Arbiter, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][defaultrolloverstrategy] = PluginType [pluginClass=Lazy value not initialized, key=defaultrolloverstrategy, elementType=DefaultRolloverStrategy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][delete] = PluginType [pluginClass=Lazy value not initialized, key=delete, elementType=Delete, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][denyallfilter] = PluginType [pluginClass=Lazy value not initialized, key=denyallfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][directwriterolloverstrategy] = PluginType [pluginClass=Lazy value not initialized, key=directwriterolloverstrategy, elementType=DirectWriteRolloverStrategy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][disruptorblockingqueue] = PluginType [pluginClass=Lazy value not initialized, key=disruptorblockingqueue, elementType=BlockingQueueFactory, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][dynamicthresholdfilter] = PluginType [pluginClass=Lazy value not initialized, key=dynamicthresholdfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][environmentarbiter] = PluginType [pluginClass=Lazy value not initialized, key=environmentarbiter, elementType=Arbiter, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][failover] = PluginType [pluginClass=Lazy value not initialized, key=failover, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][failovers] = PluginType [pluginClass=Lazy value not initialized, key=failovers, elementType=failovers, isObjectPrintable=false, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][file] = PluginType [pluginClass=Lazy value not initialized, key=file, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][filters] = PluginType [pluginClass=Lazy value not initialized, key=filters, elementType=filters, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][htmllayout] = PluginType [pluginClass=Lazy value not initialized, key=htmllayout, elementType=layout, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][http] = PluginType [pluginClass=Lazy value not initialized, key=http, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][idlepurgepolicy] = PluginType [pluginClass=Lazy value not initialized, key=idlepurgepolicy, elementType=IdlePurgePolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][ifaccumulatedfilecount] = PluginType [pluginClass=Lazy value not initialized, key=ifaccumulatedfilecount, elementType=IfAccumulatedFileCount, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][ifaccumulatedfilesize] = PluginType [pluginClass=Lazy value not initialized, key=ifaccumulatedfilesize, elementType=IfAccumulatedFileSize, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][ifall] = PluginType [pluginClass=Lazy value not initialized, key=ifall, elementType=IfAll, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][ifany] = PluginType [pluginClass=Lazy value not initialized, key=ifany, elementType=IfAny, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][iffilename] = PluginType [pluginClass=Lazy value not initialized, key=iffilename, elementType=IfFileName, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][iflastmodified] = PluginType [pluginClass=Lazy value not initialized, key=iflastmodified, elementType=IfLastModified, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][ifnot] = PluginType [pluginClass=Lazy value not initialized, key=ifnot, elementType=IfNot, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][keystore] = PluginType [pluginClass=Lazy value not initialized, key=keystore, elementType=KeyStore, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][keyvaluepair] = PluginType [pluginClass=Lazy value not initialized, key=keyvaluepair, elementType=KeyValuePair, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][levelmatchfilter] = PluginType [pluginClass=Lazy value not initialized, key=levelmatchfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][levelpatternselector] = PluginType [pluginClass=Lazy value not initialized, key=levelpatternselector, elementType=patternSelector, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][levelrangefilter] = PluginType [pluginClass=Lazy value not initialized, key=levelrangefilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][linkedtransferqueue] = PluginType [pluginClass=Lazy value not initialized, key=linkedtransferqueue, elementType=BlockingQueueFactory, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][logger] = PluginType [pluginClass=Lazy value not initialized, key=logger, elementType=logger, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][loggerfields] = PluginType [pluginClass=Lazy value not initialized, key=loggerfields, elementType=LoggerFields, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][loggernamelevelrewritepolicy] = PluginType [pluginClass=Lazy value not initialized, key=loggernamelevelrewritepolicy, elementType=rewritePolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][loggers] = PluginType [pluginClass=Lazy value not initialized, key=loggers, elementType=loggers, isObjectPrintable=false, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][mapfilter] = PluginType [pluginClass=Lazy value not initialized, key=mapfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][maprewritepolicy] = PluginType [pluginClass=Lazy value not initialized, key=maprewritepolicy, elementType=rewritePolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][markerfilter] = PluginType [pluginClass=Lazy value not initialized, key=markerfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][markerpatternselector] = PluginType [pluginClass=Lazy value not initialized, key=markerpatternselector, elementType=patternSelector, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][memorymappedfile] = PluginType [pluginClass=Lazy value not initialized, key=memorymappedfile, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][multicastdns] = PluginType [pluginClass=Lazy value not initialized, key=multicastdns, elementType=advertiser, isObjectPrintable=false, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][mutablethreadcontextmapfilter] = PluginType [pluginClass=Lazy value not initialized, key=mutablethreadcontextmapfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][mutablecontextmapfilter] = PluginType [pluginClass=Lazy value not initialized, key=mutablecontextmapfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][nomarkerfilter] = PluginType [pluginClass=Lazy value not initialized, key=nomarkerfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][nooptriggeringpolicy] = PluginType [pluginClass=Lazy value not initialized, key=nooptriggeringpolicy, elementType=NoOpTriggeringPolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][nosql] = PluginType [pluginClass=Lazy value not initialized, key=nosql, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][null] = PluginType [pluginClass=Lazy value not initialized, key=null, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][onstartuptriggeringpolicy] = PluginType [pluginClass=Lazy value not initialized, key=onstartuptriggeringpolicy, elementType=OnStartupTriggeringPolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][patternlayout] = PluginType [pluginClass=Lazy value not initialized, key=patternlayout, elementType=layout, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][patternmatch] = PluginType [pluginClass=Lazy value not initialized, key=patternmatch, elementType=PatternMatch, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][policies] = PluginType [pluginClass=Lazy value not initialized, key=policies, elementType=Policies, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][posixviewattribute] = PluginType [pluginClass=Lazy value not initialized, key=posixviewattribute, elementType=PosixViewAttribute, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][properties] = PluginType [pluginClass=Lazy value not initialized, key=properties, elementType=properties, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][propertiesrewritepolicy] = PluginType [pluginClass=Lazy value not initialized, key=propertiesrewritepolicy, elementType=rewritePolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][property] = PluginType [pluginClass=Lazy value not initialized, key=property, elementType=Property, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][randomaccessfile] = PluginType [pluginClass=Lazy value not initialized, key=randomaccessfile, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][regexfilter] = PluginType [pluginClass=Lazy value not initialized, key=regexfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][replace] = PluginType [pluginClass=Lazy value not initialized, key=replace, elementType=replace, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][rewrite] = PluginType [pluginClass=Lazy value not initialized, key=rewrite, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][rfc5424layout] = PluginType [pluginClass=Lazy value not initialized, key=rfc5424layout, elementType=layout, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][rollingfile] = PluginType [pluginClass=Lazy value not initialized, key=rollingfile, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][rollingrandomaccessfile] = PluginType [pluginClass=Lazy value not initialized, key=rollingrandomaccessfile, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][root] = PluginType [pluginClass=Lazy value not initialized, key=root, elementType=root, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][route] = PluginType [pluginClass=Lazy value not initialized, key=route, elementType=Route, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][routes] = PluginType [pluginClass=Lazy value not initialized, key=routes, elementType=Routes, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][routing] = PluginType [pluginClass=Lazy value not initialized, key=routing, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][select] = PluginType [pluginClass=Lazy value not initialized, key=select, elementType=Arbiter, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][sizebasedtriggeringpolicy] = PluginType [pluginClass=Lazy value not initialized, key=sizebasedtriggeringpolicy, elementType=SizeBasedTriggeringPolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][socket] = PluginType [pluginClass=Lazy value not initialized, key=socket, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][socketaddress] = PluginType [pluginClass=Lazy value not initialized, key=socketaddress, elementType=SocketAddress, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][socketoptions] = PluginType [pluginClass=Lazy value not initialized, key=socketoptions, elementType=SocketOptions, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][socketperformancepreferences] = PluginType [pluginClass=Lazy value not initialized, key=socketperformancepreferences, elementType=SocketPerformancePreferences, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][sortbymodificationtime] = PluginType [pluginClass=Lazy value not initialized, key=sortbymodificationtime, elementType=SortByModificationTime, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][ssl] = PluginType [pluginClass=Lazy value not initialized, key=ssl, elementType=Ssl, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][stringmatchfilter] = PluginType [pluginClass=Lazy value not initialized, key=stringmatchfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][structureddatafilter] = PluginType [pluginClass=Lazy value not initialized, key=structureddatafilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][syslog] = PluginType [pluginClass=Lazy value not initialized, key=syslog, elementType=appender, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][sysloglayout] = PluginType [pluginClass=Lazy value not initialized, key=sysloglayout, elementType=layout, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][systempropertyarbiter] = PluginType [pluginClass=Lazy value not initialized, key=systempropertyarbiter, elementType=Arbiter, isObjectPrintable=true, isDeferChildren==true, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][threadcontextmapfilter] = PluginType [pluginClass=Lazy value not initialized, key=threadcontextmapfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][contextmapfilter] = PluginType [pluginClass=Lazy value not initialized, key=contextmapfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][thresholdfilter] = PluginType [pluginClass=Lazy value not initialized, key=thresholdfilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][timebasedtriggeringpolicy] = PluginType [pluginClass=Lazy value not initialized, key=timebasedtriggeringpolicy, elementType=TimeBasedTriggeringPolicy, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][timefilter] = PluginType [pluginClass=Lazy value not initialized, key=timefilter, elementType=filter, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
TRACE StatusConsoleListener Merged PluginNamespace[Core][truststore] = PluginType [pluginClass=Lazy value not initialized, key=truststore, elementType=TrustStore, isObjectPrintable=true, isDeferChildren==false, namespace=Core]
DEBUG StatusConsoleListener Discovered 97 plugins in namespace 'Core'
DEBUG StatusConsoleListener Discovered 0 plugins in namespace 'Level'
DEBUG StatusConsoleListener Configuring child nodes of Appenders
DEBUG StatusConsoleListener Configured child nodes of Appenders
TRACE StatusConsoleListener Configuring node Appenders element Key[type: org.apache.logging.log4j.core.Appender[]; namespace: Core; name: Appenders; qualifierType: PluginElement]
ERROR StatusConsoleListener Appenders contains an invalid element or attribute "MyAppender"
DEBUG StatusConsoleListener Configuring child nodes of Loggers
DEBUG StatusConsoleListener Configuring child nodes of Root
DEBUG StatusConsoleListener Configuring child nodes of AppenderRef
DEBUG StatusConsoleListener Configured child nodes of AppenderRef
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][bigdecimalconverter] = PluginType [pluginClass=Lazy value not initialized, key=bigdecimalconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][bigintegerconverter] = PluginType [pluginClass=Lazy value not initialized, key=bigintegerconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][bytearrayconverter] = PluginType [pluginClass=Lazy value not initialized, key=bytearrayconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][chararrayconverter] = PluginType [pluginClass=Lazy value not initialized, key=chararrayconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][charsetconverter] = PluginType [pluginClass=Lazy value not initialized, key=charsetconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][classconverter] = PluginType [pluginClass=Lazy value not initialized, key=classconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][cronexpressionconverter] = PluginType [pluginClass=Lazy value not initialized, key=cronexpressionconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][durationconverter] = PluginType [pluginClass=Lazy value not initialized, key=durationconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][fileconverter] = PluginType [pluginClass=Lazy value not initialized, key=fileconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][inetaddressconverter] = PluginType [pluginClass=Lazy value not initialized, key=inetaddressconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][levelconverter] = PluginType [pluginClass=Lazy value not initialized, key=levelconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][pathconverter] = PluginType [pluginClass=Lazy value not initialized, key=pathconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][patternconverter] = PluginType [pluginClass=Lazy value not initialized, key=patternconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][securityproviderconverter] = PluginType [pluginClass=Lazy value not initialized, key=securityproviderconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][uriconverter] = PluginType [pluginClass=Lazy value not initialized, key=uriconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][urlconverter] = PluginType [pluginClass=Lazy value not initialized, key=urlconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][uuidconverter] = PluginType [pluginClass=Lazy value not initialized, key=uuidconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
TRACE StatusConsoleListener Merged PluginNamespace[TypeConverter][zoneidconverter] = PluginType [pluginClass=Lazy value not initialized, key=zoneidconverter, elementType=, isObjectPrintable=false, isDeferChildren==false, namespace=TypeConverter]
DEBUG StatusConsoleListener Discovered 18 plugins in namespace 'TypeConverter'
TRACE StatusConsoleListener Configuring node AppenderRef attribute Key[type: java.lang.String; name: ref; qualifierType: PluginAttribute]
TRACE StatusConsoleListener Configured node AppenderRef Key[type: java.lang.String; name: ref; qualifierType: PluginAttribute]=myAppender
TRACE StatusConsoleListener Configuring node AppenderRef attribute Key[type: org.apache.logging.log4j.Level; name: level; qualifierType: PluginAttribute]
TRACE StatusConsoleListener Configured node AppenderRef Key[type: org.apache.logging.log4j.Level; name: level; qualifierType: PluginAttribute]=null (default value)
TRACE StatusConsoleListener Configuring node AppenderRef element Key[type: org.apache.logging.log4j.core.Filter; namespace: Core; name: filter; qualifierType: PluginElement]
DEBUG StatusConsoleListener Configured child nodes of Root
DEBUG StatusConsoleListener org.apache.logging.log4j.core.time.internal.SystemClock supports precise timestamps.
TRACE StatusConsoleListener Configuring node Root attribute Key[type: java.lang.String; name: includeLocation; qualifierType: PluginAttribute]
TRACE StatusConsoleListener Configured node Root Key[type: java.lang.String; name: includeLocation; qualifierType: PluginAttribute]=null (default value)
TRACE StatusConsoleListener Configuring node Root attribute Key[type: boolean; name: additivity; qualifierType: PluginAttribute]
TRACE StatusConsoleListener Configured node Root Key[type: boolean; name: additivity; qualifierType: PluginAttribute]=false (default value)
TRACE StatusConsoleListener Configuring node Root attribute Key[type: java.lang.String; name: levelAndRefs; qualifierType: PluginAttribute]
TRACE StatusConsoleListener Configured node Root Key[type: java.lang.String; name: levelAndRefs; qualifierType: PluginAttribute]=null (default value)
TRACE StatusConsoleListener Configuring node Root element Key[type: org.apache.logging.log4j.core.config.Property[]; namespace: Core; name: properties; qualifierType: PluginElement]
TRACE StatusConsoleListener Configuring node Root element Key[type: org.apache.logging.log4j.core.Filter; namespace: Core; name: filter; qualifierType: PluginElement]
TRACE StatusConsoleListener Configuring node Root attribute Key[type: org.apache.logging.log4j.Level; name: level; qualifierType: PluginAttribute]
TRACE StatusConsoleListener Configured node Root Key[type: org.apache.logging.log4j.Level; name: level; qualifierType: PluginAttribute]=ALL
TRACE StatusConsoleListener Configuring node Root element Key[type: org.apache.logging.log4j.core.config.AppenderRef[]; namespace: Core; name: refs; qualifierType: PluginElement]
DEBUG StatusConsoleListener Configured child nodes of Loggers
TRACE StatusConsoleListener Configuring node Loggers element Key[type: org.apache.logging.log4j.core.config.LoggerConfig[]; namespace: Core; name: Loggers; qualifierType: PluginElement]
ERROR StatusConsoleListener Unable to locate appender "myAppender" for logger config "root"
DEBUG StatusConsoleListener Configuration XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml] initialized
DEBUG StatusConsoleListener Starting configuration XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml]
DEBUG StatusConsoleListener Started configuration XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml] OK.
TRACE StatusConsoleListener Stopping DefaultConfiguration...
TRACE StatusConsoleListener DefaultConfiguration notified 1 ReliabilityStrategies that config will be stopped.
TRACE StatusConsoleListener DefaultConfiguration stopping root LoggerConfig.
TRACE StatusConsoleListener DefaultConfiguration notifying ReliabilityStrategies that appenders will be stopped.
TRACE StatusConsoleListener DefaultConfiguration stopping remaining Appenders.
DEBUG StatusConsoleListener Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
DEBUG StatusConsoleListener OutputStream closed
DEBUG StatusConsoleListener Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all resources released: true
DEBUG StatusConsoleListener Appender DefaultConsole-1 stopped with status true
TRACE StatusConsoleListener DefaultConfiguration stopped 1 remaining Appenders.
TRACE StatusConsoleListener DefaultConfiguration cleaning Appenders from 1 LoggerConfigs.
DEBUG StatusConsoleListener Stopped DefaultConfiguration OK
DEBUG StatusConsoleListener LoggerContext[76ed5528] started OK with configuration XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml].
DEBUG StatusConsoleListener Stopping LoggerContext[76ed5528]
DEBUG StatusConsoleListener Stopping LoggerContext[76ed5528]...
TRACE StatusConsoleListener Stopping XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml]...
TRACE StatusConsoleListener XmlConfiguration notified 2 ReliabilityStrategies that config will be stopped.
TRACE StatusConsoleListener XmlConfiguration stopping 1 LoggerConfigs.
TRACE StatusConsoleListener XmlConfiguration stopping root LoggerConfig.
TRACE StatusConsoleListener XmlConfiguration notifying ReliabilityStrategies that appenders will be stopped.
TRACE StatusConsoleListener XmlConfiguration stopping remaining Appenders.
TRACE StatusConsoleListener XmlConfiguration stopped 0 remaining Appenders.
TRACE StatusConsoleListener XmlConfiguration cleaning Appenders from 2 LoggerConfigs.
DEBUG StatusConsoleListener Stopped XmlConfiguration[location=C:\Users\Yevhen\IdeaProjects\log4j2-demo\target\classes\log4j2.xml] OK
DEBUG StatusConsoleListener Stopped LoggerContext[76ed5528] with status true
I'm not really familiar with 3.x version.
This is my demo project
Is there anything I'm missing?
In 3.x the annotation processor does not run automatically. Any project that has log4j plugins needs to add it. In 3.x it has moved to its own module, log4j-plugin-processor. It would look something like the below:
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <annotationProcessorPaths combine.children="append">
                <!-- `org.apache.logging.log4j.plugin.processor.PluginProcessor` invocation: -->
                <path>
                  <groupId>org.apache.logging.log4j</groupId>
                  <artifactId>log4j-plugin-processor</artifactId>
                  <version>${log4j.version}</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </plugin>
@yvasyliev,
I am closing this issue then, since it works in 3.x and we can not port it to 2.x (due to the JDK 8 baseline).