Log4J2 appender not included in ThreadContext folder

I have the following Log4J2 XML configuration:

<Routing name="myAppender">
    <Routes pattern="$${ctx:workId}">
        <Route>
            <File fileName="${my-path}/sites/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log" name="myAppender-${ctx:workId}">
                <MarkerFilter marker="TELEMETRIC" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout>
                    <Pattern>[%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X%m%n</Pattern>
                </PatternLayout>
            </File>
        </Route>
    </Routes>
</Routing>

<Async name="Async">     
    <AppenderRef ref="myAppender" level="info"/>
</Async>

However, whenever a log4j2 recording file is written to a file, it does not use the correct line ${ctx:employeeId}when writing to the specified file path.

The first time a log4j2 recording file is written to a file, it writes the correct file path specified ${ctx:employeeId}. But whenever an employee information with a different identifier is placed in a thread context, the application is still registered in the old file path.

For example, the first time you log in, it writes to the correct path:

D:/example/logs/sites/1/2015-08-22/2/emp.log

But when the registrar is registered for the next employee ID (using the new ThreadContext), it is still registered in

D:/example/logs/sites/1/2015-08-22/2/emp.log

instead, for example:

D:/example/logs/sites/1/2015-08-22/3/emp.log

( , .)

employeeId [$${ctx:employeeId}], , %X. , employeeId ThreadContext, ${ctx:employeeId}.

- , - ? - ? Log4j2? !

+2
1

, , , , - , , .

, , , , , , , , , , , , , -, , .

:

package pkg;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.ThreadContext;

public class Log4j2DiffFilePerCtxVarMain {
    private static final Marker TELEMETRIC = MarkerManager.getMarker("TELEMETRIC");

    public static void main(String[] args){
        Logger log = LogManager.getLogger();

        ThreadContext.put("workId", "mainWorkId");
        ThreadContext.put("employeeId", "mainEmployeeId");

        log.info(TELEMETRIC, "Hey here some info log from main!");

        Thread t1 = new Thread(new Runnable(){
            public void run(){
                Logger log = LogManager.getLogger();
                ThreadContext.put("workId", "thread1WorkId");
                ThreadContext.put("employeeId", "thread1EmployeeId");

                log.info(TELEMETRIC, "Hey here some info log from thread1!");
            }
        });
        t1.start();
    }
}

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Routing name="myAppender">
            <Routes pattern="$${ctx:workId}">
                <Route>
                    <File
                        fileName="logs/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log"
                        name="myAppender-${ctx:workId}">
                        <MarkerFilter marker="TELEMETRIC" onMatch="ACCEPT"
                            onMismatch="DENY" />
                        <PatternLayout>
                            <Pattern>[%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X %m%n</Pattern>
                        </PatternLayout>
                    </File>
                </Route>
            </Routes>
        </Routing>

        <Async name="Async">
            <AppenderRef ref="myAppender" level="info" />
        </Async>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <appender-ref ref="Async" />
        </Root>
    </Loggers>
</Configuration>

log4j2.xml, :

enter image description here

:

[2017-04-13T20:42:49,814][INFO ][p.Log4j2DiffFilePerCtxVarMain][TELEMETRIC][mainEmployeeId] {employeeId=mainEmployeeId, workId=mainWorkId} Hey here some info log from main!

:

[2017-04-13T20:42:49,822][INFO ][p.Log4j2DiffFilePerCtxVarMain$1][TELEMETRIC][thread1EmployeeId] {employeeId=thread1EmployeeId, workId=thread1WorkId} Hey here some info log from thread1!

, !

+1

All Articles