Java Class
import org.apache.logging.log4j.ThreadContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogsTest123 {
Logger logger = LoggerFactory.getLogger(LogsTest123.class);
public static void main(String[] args) {
final LogsTest123 logsTest123 = new LogsTest123();
logsTest123.check();
}
private void check() {
ThreadContext.put("identifier", "threadcontext value");
logger.info("sjdoe");
}
}
我正在使用的Log4j配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" name="devToolServices"
packages="com.bidgely.cloud.utils.log4j2">
<Properties>
<Property name="baseDir">coding/logs
</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile" fileName="${baseDir}/portUser-$${ctx:identifier}.log"
filePattern="${baseDir}/portUser-$${ctx:identifier}.log.%d{yyyy-MM-dd-HH}.%i">
<PatternLayout
pattern="%h - [%d{yyyy-MM-dd HH:mm:ss,SSS}] - %C:%M:%L - %t - %p -$${ctx:identifier} : %m%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="24"
modulate="true" />
<SizeBasedTriggeringPolicy size="500 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
生成的日志文件是 portUser - $ {ctx:identifier} .log 。占位符不会被threadcontext映射值替换。 日志文件的内容具有threadcontext映射值&#34; threadcontext值&#34; 10.10.0.143 - [2018-04-21 14:01:15,544] - com.devtools.dataSync.LogsTest123:check:18 - main - INFO -threadcontext value:sjdoe
答案 0 :(得分:0)
您需要使用它的上下文重新配置记录器。因此,所有的appender都会重新创建并使用新值进行更新。
因此,在设置ThreadContext变量后立即使用此代码以获取当前记录器上下文并更新它。
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.reconfigure();