0
votes

I am setting up log4j2 for my web application. The problem is that the logger configured like that is not logging anything using Main and Err appenders. If one looks into the log4j2 code via debugger one will see that those two appenders are not added during log4j2 initialization.

Previously, there were separate loggers for each appender, but we need just one logger. Is it possible to do it this way?

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" strict="true" name="log4j2 config">
  <Properties>
    <Property name="dataPattern">%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{3} - %m%n%ex</Property>
    <Property name="logDir">${web:rootDir}</Property>
    <Property name="moduleName">mod</Property>
    <Property name="logLevel">@log.level@</Property>
  </Properties>

  <Filter type="ThresholdFilter" level="all"/>
 <Appenders>
    <Appender type="Console" name="Out">
      <Layout type="PatternLayout" pattern="${dataPattern}"/>
    </Appender>

  <Appender type="RollingFile" name="Main" fileName="${logDir}/${moduleName}_main.log"
                   filePattern="${logDir}/${moduleName}_main.log.%i">
        <Layout type="PatternLayout" pattern="${dataPattern}"/>
        <Policies>
          <SizeBasedTriggeringPolicy size="8 MB"/>
        </Policies>
        <DefaultRolloverStrategy max="10" fileIndex="min"/>
    </Appender>

    <Appender type="RollingFile" name="Err" fileName="${logDir}/${moduleName}_err.log"
                   filePattern="${logDir}/${moduleName}_err.log.%i">
        <Layout type="PatternLayout" pattern="${dataPattern}"/>
        <Filter type="ThresholdFilter" level="error"/>
        <Policies>
          <SizeBasedTriggeringPolicy size="8 MB"/>
        </Policies>
        <DefaultRolloverStrategy max="10" fileIndex="min"/>
    </Appender>
 <Loggers>
      <Logger name="com.dsl.${moduleName}" level="${logLevel}">
          <AppenderRef ref="Main"/>
          <AppenderRef ref="Err"/>
      </Logger>
<Root level="${logLevel}">
        <AppenderRef ref="Main"/>
        <AppenderRef ref="Err">
            <Filter type="ThresholdFilter" level="error"/>
        </AppenderRef>      
    </Root>
  </Loggers>
</Configuration>

There is an error:

Unable to inject fields into builder class for plugin type class org.apache.logging.log4j.core.appender.RollingFileAppender, element RollingFile. java.lang.IllegalStateException: ManagerFactory [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory@61b3c057] unable to create manager for [${web:rootDir}/mod_main.log] with data [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$FactoryData@1e722a46[pattern=${web:rootDir}/mod_main.log.%i, append=true, bufferedIO=true, bufferSize=8192, policy=CompositeTriggeringPolicy(policies=[SizeBasedTriggeringPolicy(size=8388608)]), strategy=DefaultRolloverStrategy(min=1, max=10), advertiseURI=null, layout=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{3} - %m%n%ex]]

ERROR Unable to invoke factory method in class class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile. java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender

As well as:

ERROR Null object returned for RollingFile in Appenders.
ERROR Null object returned for RollingFile in Appenders.
ERROR Unable to locate appender "Main" for logger config "root"
ERROR Unable to locate appender "Err" for logger config "root"
ERROR Unable to locate appender "Main" for logger config "com.dfs.acs"
ERROR Unable to locate appender "Err" for logger config "com.dfs.acs"
1

1 Answers

0
votes

It appeared to be the problem with resolving of ${web:rootDir} for servlet 3.0.