1
votes

my logger only logs messages on the root logger ServerAppenderV2,log files are generated properly,when i use change the level to debug in root i could see logs in both appenders defined in root ,but still no logs in the file appenders FileAppender and PerfAppender.

for the following code :

import logging.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestLog {
  private static final Logger logger= Logger.getLogger(TestLog.class);

    public static void main(String [] args){


       logger.perf("hello from debug",null,null,null,null);
       logger.log(Traces.43E, "info", 12);
       logger.debug("hello from debug",null);
    }
}

here is my Logger class and the markers:

public class Logger {

    private static final String ID_TRACE = "IdTrace";
    private static final Marker MARKER_PERF = MarkerFactory.getMarker("perf");
    private static final Marker V2 = MarkerFactory.getMarker("V2");
    private Logger delegate;


    public void debug(String message, Object... objects) {
        delegate.debug(message, objects);
    }

    public void log(Traces trace, Object... params) {

            Marker marker=V2;
            MDC.clear();
            MDC.put(ID_TRACE, trace.getId());

            switch(trace.getLevel()) {
                case DEBUG:
                    this.delegate.debug(marker, trace.getMessage(), params);
                    break;
                case INFO:
                    this.delegate.info(marker, trace.getMessage(), params);
                    break;
                case WARNING:
                    this.delegate.warn(marker, trace.getMessage(), params);
                    break;
                default:
                    this.delegate.error(marker, trace.getMessage(), params);
            }
        }

    public void perf(String msg, Object... params) {
        this.delegate.info(MARKER_PERF, msg, params);
    }

    }

here is my configuration Log4j2.xml:

<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss,SSS} %5p --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
        <Property name="PERF_LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss,SSS};%5p;%t;%m;%n
        </Property>
    </Properties>

    <Appenders>
        <RollingFile name="ServerAppender" fileName="logs\\server.log"
                     filePattern="logs\\server-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
        <RollingFile name="ServerAppenderV2" fileName="logs\\serverV2.log"
                     filePattern="logs/serverV2-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
        <RollingFile name="FileAppender" fileName="logs\\appli.log"
                     filePattern="logs\\appli-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <RollingFile name="PerfAppender" fileName="logs\\perf.log"
                     filePattern="logs\\perf-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${PERF_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <AsyncLogger name="logging" level="info" additivity="false">
            <AppenderRef ref="FileAppender">
                <MarkerFilter marker="perf" onMatch="DENY" onMismatch="ACCEPT"/>
            </AppenderRef>
                <AppenderRef ref="PerfAppender">
                <MarkerFilter marker="perf" onMatch="ACCEPT" onMismatch="DENY"/>
            </AppenderRef>
        </AsyncLogger>

        <Root level="info">
            <AppenderRef ref="ServerAppender" >
                <MarkerFilter marker="V2" onMatch="DENY" onMismatch="ACCEPT"/>
            </AppenderRef>
                    <AppenderRef ref="ServerAppenderV2">
                <MarkerFilter marker="V2" onMatch="ACCEPT" onMismatch="DENY"/>
            </AppenderRef>
        </Root>
    </Loggers>

</Configuration>
2

2 Answers

1
votes

That's because of this configuration where you have mentioned logger name as "logging".

<AsyncLogger name="logging" level="info" additivity="false">
   // configurations
</AsyncLogger>

but while accessing you are using this.

private static final Logger logger= Logger.getLogger(TestLog.class);

which will resolve the logger name using package and className.

With your current config, you should access logger like this.

private static final Logger logger= Logger.getLogger("logging");

Alternatively, you can configure like this. Let's say if your TestLog.class is in package org.random.service, your configuration should look like this.

<AsyncLogger name="org.random.service.TestLog" level="info" additivity="false">
   // configurations
</AsyncLogger>

To Enable the complete package, you can remove className from logger name.

<AsyncLogger name="org.random.service" level="info" additivity="false">
   // configurations
</AsyncLogger>
0
votes

thanks for the response ,i am new to Log4J ,yes the logger name is the filter for log4j and i should have referenced the classes using LOG4J .