, , , , - , , .
, , , , , , , , , , , , , -, , .
:
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, :

:
[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!
, !