Log4J2 в Wildfly 11 - вызывает ОШИБКУ Невозможно найти плагин

Написал простое веб-приложение, использующее программную настройку Log4J2. (нет log4j2.xml)

Фрагмент конфигуратора выглядит следующим образом

ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR);
builder.setConfigurationName("LogicLoggerConfigurations");
builder.setPackages("main.logging.config");

AppenderComponentBuilder appenderBuilderConsole = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
        ConsoleAppender.Target.SYSTEM_OUT);
AppenderComponentBuilder appenderBuilderFile = builder.newAppender("toFile", "FILE").addAttribute("fileName",
        "/pathto/logtest.log");
appenderBuilderConsole.add(builder.newLayout("PatternLayout")
        .addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
appenderBuilderFile.add(builder.newLayout("PatternLayout")
        .addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
AppenderComponentBuilder appenderBuilder = builder.newAppender("lacmem", "LogicMemoryAppender");
appenderBuilder.add(builder.newLayout("PatternLayout")
        .addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
builder.add(appenderBuilder);
builder.add(appenderBuilderConsole);
builder.add(appenderBuilderFile);
builder.add(builder.newLogger("main", Level.TRACE)
        .add(builder.newAppenderRef("lacmem")).addAttribute("additivity", true));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout"))
        .add(builder.newAppenderRef("toFile")));
logicLoggerContext = Configurator.initialize(builder.build());
logicLoggerContext.updateLoggers();

В пакетах main.logging.config есть настраиваемый модуль добавления (плагин), который выглядит следующим образом:

@Plugin(name = "LogicMemoryAppender", category = "Core", elementType = "appender", printObject = true)
public class LogicMemoryAppender extends AbstractAppender {

    List<Map<String, Object>> logs = new CopyOnWriteArrayList<>();

    protected LogicMemoryAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {
        super(name, filter, layout, ignoreExceptions);
    }

    /*
     *
     * @see
     * org.apache.logging.log4j.core.Appender#append(org.apache.logging.log4j.
     * core.LogEvent)
     */
    public void append(LogEvent event) {
        Map<String, Object> logEntry = new HashMap<String, Object>();
        logEntry.put("logger", event.getLoggerName());
        if (null != event.getLevel())
            logEntry.put("level", event.getLevel());

        long millis = event.getTimeMillis();
        logEntry.put("ts", millis);
        logEntry.put("timestamp", "timestamp");

        String exceptionText = "";
        if (null != event.getThrown()) {
            exceptionText = event.getThrown().getMessage();
        }

        String msg = event.getMessage().toString();
        if (!msg.isEmpty()) {
            msg = msg.replace("\"", "\\\"");
            msg = msg.replace("\n", "\\n");
            if (!exceptionText.isEmpty()) {
                logEntry.put("message", msg + " : " + exceptionText);
            } else {
                logEntry.put("message", msg);
            }
        } else {
            logEntry.put("message", exceptionText);
        }
System.out.println("Log entry added "+logEntry);
        logs.add(logEntry);

    }


    /**
     * Factory method called by Log4j2 to initialize this appender.
     * @param name
     * @param layout
     * @param filter
     * @return
     */
    @PluginFactory
    public static LogicMemoryAppender createAppender(
            @PluginAttribute("name") String name,
            @PluginElement("Layout") Layout<? extends Serializable> layout,
            @PluginElement("Filter") final Filter filter) {
        if (name == null) {
            LOGGER.error("No name provided for LogicMemoryAppender");
            return null;
        }
        if (layout == null) {
            layout = PatternLayout.createDefaultLayout();
        }
        return new LogicMemoryAppender(name, filter, layout, true);
    }

}

Приложение представляет собой приложение на основе сервлета, которое имеет один оператор регистрации в doGet().

soloLogger = LogManager.getLogger();
soloLogger.trace("What is up");

Я также отключил подсистему ведения журнала, добавив приведенную ниже конфигурацию в Web-Inf.

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclude-subsystems>
            <subsystem name="logging"/>
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>

Приложение развертывается в виде файла WAR и загружается в WildFly через консоль администратора.

Когда я захожу по URL-адресу, я вижу следующую ошибку в консоли Wildfly. Код работает, как и ожидалось, для Tomcat8x и Weblogic 12.2.1.3, но не для Jboss. :(

5:12:45,204 INFO  [stdout] (default task-1) 2017-10-30 15:12:45,203 default task-1 ERROR Unable to locate plugin type for LogicMemoryAppender
15:12:45,237 INFO  [stdout] (default task-1) 2017-10-30 15:12:45,237 default task-1 ERROR Unable to locate plugin for LogicMemoryAppender
15:12:45,247 INFO  [stdout] (default task-1) 2017-10-30 15:12:45,246 default task-1 ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.config.AppendersPlugin for element Appenders: java.lang.NullPointerException java.lang.NullPointerException
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor.visit(PluginElementVisitor.java:52)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.generateParameters(PluginBuilder.java:248)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:135)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:958)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:898)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:513)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:237)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:204)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:161)
15:12:45,247 INFO  [stdout] (default task-1)    at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:57)
15:12:45,247 INFO  [stdout] (default task-1)    at main.test.HanSolo.initConfig(HanSolo.java:63)
15:12:45,248 INFO  [stdout] (default task-1)    at main.test.HanSolo.<clinit>(HanSolo.java:23)
15:12:45,248 INFO  [stdout] (default task-1)    at main.test.TestLogging.doGet(TestLogging.java:31)
15:12:45,248 INFO  [stdout] (default task-1)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
15:12:45,248 INFO  [stdout] (default task-1)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
15:12:45,248 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
15:12:45,248 INFO  [stdout] (default task-1)    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
15:12:45,249 INFO  [stdout] (default task-1)    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
15:12:45,249 INFO  [stdout] (default task-1)    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:326)
15:12:45,250 INFO  [stdout] (default task-1)    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:812)
15:12:45,250 INFO  [stdout] (default task-1)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
15:12:45,250 INFO  [stdout] (default task-1)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
15:12:45,250 INFO  [stdout] (default task-1)    at java.lang.Thread.run(Thread.java:745)
15:12:45,250 INFO  [stdout] (default task-1) 
15:12:45,250 INFO  [stdout] (default task-1) 2017-10-30 15:12:45,250 default task-1 ERROR Unable to locate appender "Stdout" for logger config "root"
15:12:45,250 INFO  [stdout] (default task-1) 2017-10-30 15:12:45,250 default task-1 ERROR Unable to locate appender "toFile" for logger config "root"
15:12:45,251 INFO  [stdout] (default task-1) 2017-10-30 15:12:45,251 default task-1 ERROR Unable to locate appender "lacmem" for logger config "main"

Log4j2, похоже, не распознает аннотированный плагин в WildFly. Не уверен, что это проблема с log4j2 или WildFly. JVM — это Java 8x112.

РЕДАКТИРОВАТЬ: та же ошибка в WildFly 10 Final.


person NishM    schedule 30.10.2017    source источник
comment
Где находятся все классы в вашем развертывании?   -  person James R. Perkins    schedule 02.11.2017
comment
Это сгенерированный maven стандартный файл WAR. Веб-инф/классы   -  person NishM    schedule 02.11.2017


Ответы (1)


Я не смог найти решение проблемы, упомянутой выше, но я нашел обходной путь.

Вместо того, чтобы выполнять настройку программно, я объединил ее с файлом конфигурации XML (log4j2.xml). Внутри XML я инициализировал все регистраторы, которые использую в коде.

Ознакомьтесь с официальным документом для получения дополнительной информации о том, как объединить .

Затем для программной конфигурации 1. Создайте свой собственный ConfigurationFactory, который 2. возвращает экземпляр вашей собственной XMLConfiguration -> Создайте класс, расширяющий XMLConfiguration, который манипулирует и добавляет приложения к вышеуказанным регистраторам ( LoggerConfig).

Как только я закончил изменять конфигурацию, я позвонил myloggercontext.updateLoggers(), чтобы загрузить изменения. Здесь следует отметить, что для регистрации вашей ConfigurationFactory вам нужно будет добавить файл свойств с именем log4j2.component.properties в путь к классам. Содержимое моего файла свойств приведено ниже.

log4j.configurationFactory=main.logging.config.LogConfigurationFactory

Это обеспечит загрузку вашей ConfigurationFactory перед любыми вызовами регистратора внутри вашего приложения.

Вышеупомянутые изменения сработали для JBoss, поскольку он смог загрузить плагины, как и ожидалось.

person NishM    schedule 02.11.2017