Here is a snippet of routing code from the working log4j.xml file.
<Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %-50logger{4}: %msg%n</pattern> </PatternLayout> </Console> <Routing name="RoutingAppender"> <Routes pattern="${ctx:logFileName}"> <Route> <RollingFile name="Rolling-${ctx:logFileName}" fileName="${sys:log.path}/${ctx:logFileName}.javalog" filePattern="./logs/${date:yyyy-MM}/${ctx:logFileName}_%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %-50logger{4}: %msg%n</pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy interval="6" modulate="true" /> <SizeBasedTriggeringPolicy size="10 MB" /> </Policies> </RollingFile> </Route> <Route key="${ctx:logFileName}" ref="ConsoleAppender" /> </Routes> </Routing> </Appenders> <loggers> <root level="debug"> <appender-ref ref="RoutingAppender" level="debug" /> </root> </loggers>
The key "logFileName" can be added to the stream context map in the run () method of the Runnable class as follows:
public class SomeClass implements Runnable{ private int threadID; public SomeClass(int threadID){ this.threadID=threadID; } @Override public void run() { String logFileName = "thread_log_"+ threadID; ThreadContext.put("logFileName", logFileName);
In addition, you need to import the correct log4j packages, as shown below.
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext;
Please note that the next import will not work. LogManager and Logger should also come from org.apache.logging.log4j.
import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.logging.log4j.ThreadContext;
source share