You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换至JsonTemplateLayout后ConverterKey(%userId)无法解析求助

问题:JsonTemplateLayout无法解析自定义LogEventPatternConverter的%userId变量

我正打算把日志布局从Elastic的EcsLayout替换为Log4j2的JsonTemplateLayout,但遇到了问题:自定义LogEventPatternConverter提供的ConverterKey变量%userId,切换后无法被解析,而此前使用EcsLayout时该变量可正常解析。

日志输出示例

{"@timestamp":"2024-04-24T14:46:31.418Z","ecs.version":"1.2.0","log.level":"INFO","message":"test log message","process.thread.name":"default task-1","log.logger":"foobar","event.dataset":"usingJsonTemplateLayout","userId1":"\"%userId\"","userId2":"%userId","userId3":"%userId","userId4":"%userId","userId5":"\"%userId\""}

以下是我的配置及代码实现,恳请提供解决思路:

1. 自定义LogEventPatternConverter代码

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;

@Plugin(name = "UserId", category = PatternConverter.CATEGORY)
@ConverterKeys({"userId"})
public class UserId extends LogEventPatternConverter {

    protected UserId(String name, String style) {
        super(name, style);
    }

    public static UserId newInstance(final String[] options) {
        return new UserId("userId", "userId");
    }

    @Override
    public void format(LogEvent logEvent, StringBuilder toAppendTo) {
                 toAppendTo.append(FooUserService.getUserId())
    }
}

2. Log4j2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="org.foo.bar" status="DEBUG" strict="true" verbose="true">

    <Properties>
        <Property name="userId-a">"%"userId"</Property>
        <Property name="userId-b">%userId</Property>
    </Properties>

    <!-- 
    <Appenders>
        <Console name="ecsLayout88" direct="true">
            <EcsLayout eventDataset="usingEcsLayout">
                <KeyValuePair key="userId" value="%userId"/>
            </EcsLayout>
        </Console> 
    -->

        <Console name="jsonTemplate88" direct="true">
            <JsonTemplateLayout eventTemplateUri="classpath:EcsLayout.json">
                <EventTemplateAdditionalField key="event.dataset" value="usingJsonTemplateLayout"/>
                <EventTemplateAdditionalField key="userId1" value="${userId-a}"/>
                <EventTemplateAdditionalField key="userId2" value="${userId-b}"/>
                <EventTemplateAdditionalField key="userId3" value="%userId"/>
                <EventTemplateAdditionalField>
                    <key>userId4</key>
                    <value>%userId</value>
                </EventTemplateAdditionalField>
                <EventTemplateAdditionalField>
                    <key>userId5</key>
                    <value>"%userId"</value>
                </EventTemplateAdditionalField>
            </JsonTemplateLayout>
        </Console>
    </Appenders>

    <Loggers>
        <Logger name="foobar" additivity="false">
            <AppenderRef ref="jsonTemplate88"/>
            <!-- <AppenderRef ref="ecsLayout88"/> -->
            <Level>INFO</Level>
        </Logger>
   
        <Root>
            <Level>INFO</Level>
        </Root>
    </Loggers>
</Configuration>

3. 使用的依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.23.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.23.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-layout-template-json</artifactId>
    <version>2.23.1</version>
</dependency>

内容的提问来源于stack exchange,提问作者Ferdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:35:38