切换至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
相关产品推荐
相关产品推荐

