RollingFileAppender没有获取用于设置文件名的ThreadContext映射条目

时间:2018-04-21 08:34:59

标签: logging

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

1 个答案:

答案 0 :(得分:0)

您需要使用它的上下文重新配置记录器。因此,所有的appender都会重新创建并使用新值进行更新。

因此,在设置ThreadContext变量后立即使用此代码以获取当前记录器上下文并更新它。

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.reconfigure();