Пользовательские приложения не инициализируются для Log4j-2.14.1

#logging #log4j #log4j2

Вопрос:

Я переношу библиотеку log4j с 1.2.17 на 2.14.1 и сталкиваюсь с проблемами с пользовательскими приложениями. Я перепробовал все другие решения проблемы, которые я мог найти в отношении синтаксиса, загрузчика классов, используя атрибут «пакеты». Но я все еще не могу инициализировать пользовательское приложение.

Пожалуйста, дайте мне знать, что я здесь делаю не так. Вставка файлов конфигурации ниже

Вот мое пользовательское приложение:

 @Plugin(name = "BWLogFile", category = Core.CATEGORY_NAME, elementType = AbstractAppender.ELEMENT_TYPE)
    public class BWLogFileAppender extends AbstractAppender {
    
        private BWLogFileAppender(String name, Filter filter,
                Layout<? extends Serializable> layout, final boolean ignoreExceptions) {
            super(name, filter, layout, ignoreExceptions);
        }
        
        
        public void append(LogEvent event)    {
            //custom code here
        }
        
        @PluginFactory
        public static BWLogFileAppender 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 BWLogFileAppender");
                return null;
            }
            if (layout == null) {
                layout = PatternLayout.createDefaultLayout();
            }
            return new BWLogFileAppender(name, filter, layout, true);
        }}
 

Вот мой XML-файл :

 <?xml version="1.0" encoding="UTF-8"?> 

<configuration status="trace" packages="com.share.util">
    <properties>
        <property name="log-pattern">"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n"</property>
    </properties>

  <appenders>
      
      <BWLogFile name="bw_log">
          <PatternLayout pattern="%msg%n" />
      </BWLogFile>
      
      <console name="bw_console" target="SYSTEM_OUT">
          <patternLayout>
                <pattern>${log-pattern}</pattern>
            </patternLayout>
      </console>
      
  </appenders>


  <loggers>

      <logger name="httpclient.wire" level="warn">
        <AppenderRef ref="bw_console"/> 
      </logger>

      
      <logger name="org.apache.http.wire" level="debug">
        <AppenderRef ref="bw_log"/> 
      </logger>


      <root level="warn"> 
        <AppenderRef ref="bw_console" /> 
      </root> 
  
  </loggers> 
  
</configuration>
 

Here is my properties file :

 #Define
status = trace
name = PropertiesConfig
appenders = bw_console,bw_log

#Package to search for Custom Appenders
packages = com.share.util

#Appenders

appender.bw_console.type = Console
appender.bw_console.name = bw_console
appender.bw_console.target = SYSTEM_OUT
appender.bw_console.layout.type = PatternLayout
appender.bw_console.layout.pattern = %d{yyyy MMM dd HH:mm:ss:SSS z} %X{engine} %X{role} %m %n

appender.bw_log.type = BWLogFile
appender.bw_log.name = bw_log
appender.bw_log.layout.type = PatternLayout
appender.bw_log.layout.pattern = %msg%n


#Root-Logger
rootLogger.level = WARN
rootLogger.appenderRef.bw_console.ref = bw_console


#Jakarta HttpClient Logger
logger.bw_console.name = httpclient.wire
logger.bw_console.level = WARN
logger.bw_console.appenderRef.bw_console.ref = bw_console


logger.bw_log.name = org.apache.http.wire
logger.bw_log.level = DEBUG
logger.bw_log.appenderRef.bw_log.ref = bw_log
 

I am initializing the log4j via the below code :

 private void initlog4j2System() {
          String log4jConfigFile = "URI/to/log4j2.xml";
          ConfigurationSource source = null;
          try {
              source = new ConfigurationSource(new FileInputStream(log4jConfigFile)); //for XML file
              //source = new ConfigurationSource(new FileInputStream(log4jConfigFile), new File(log4jConfigFile));  //for properties file
          } catch (FileNotFoundException e) {
              System.out.println(e.getStackTrace());
          } catch (IOException e) {
              System.out.println(e.getStackTrace());
          }
          Configurator.initialize(null, source);
      }
 

Ошибка, которую я получаю при инициализации с помощью XML, заключается в :

 Error processing element BWLogFile ([appenders: null]): CLASS_NOT_FOUND
 

Ошибка, которую я получаю при инициализации с помощью файла свойств, заключается в :

 2021-06-30 18:27:59,879 main ERROR Unable to locate plugin for BWLogFile
2021-06-30 18:27:59,880 main DEBUG Building Plugin[name=appenders, class=org.apache.logging.log4j.core.config.AppendersPlugin].
2021-06-30 18:27:59,882 main ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.config.AppendersPlugin for element Appenders: java.lang.NullPointerException java.lang.NullPointerException
        at org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor.visit(PluginElementVisitor.java:52)
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.generateParameters(PluginBuilder.java:258)
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:135)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1000)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:940)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:551)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:287)
        at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:627)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:700)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:717)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:272)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
        at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196)
        at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:137)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:45)
        at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:30)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:363)
 

Ответ №1:

Я нашел решение из списка рассылки Apache dev. Спасибо Ральфу Герсу.

Решение : Log4jPlugins.файл dat, который присутствует в банке log4j-core-2.14.1, необходимо извлечь и добавить в банку, содержащую ваше пользовательское приложение, и поместить в каталог META-INF. Как только вы разместите это, проект начнет идентифицировать пользовательский плагин добавления.

PS: Я использую проект, не относящийся к Maven/Gradle, и обрабатываю зависимости вручную.