我想用 JsonTemplateLayout(来自 log4j2)替换我的 json-log-converter EcsLayout(来自 elastic)。
但是我有这个问题,LogEventPatternConverter 中提供用户 ID 的 ConverterKey-Variable
%userId
在切换到 JsonTemplateLayout 后不再得到解析。使用 EcsLayout %userId
已正确解决。
我的日志输出:
{"@timestamp":"2024-04-24T14:46:31.418Z","ecs.version":"1.2.0","log.level":"INFO","message":"测试 日志消息","process.thread.name":"默认 任务1","log.logger":"foobar","event.dataset":"usingJsonTemplateLayout","userId1":""%userId"","userId2":"%userId","userId3":" %userId","userId4":"%userId","userId5":""%userId""}
我使用 apache 文档作为指导:https://logging.apache.org/log4j/2.x/manual/json-template-layout.html
如果有一些指点,我将不胜感激。
LogEventPatternConverter 来自 ConverterKey,为日志提供 userId
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())
}
}
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>
用于此目的的库
<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>
如果
<EventTemplateAdditionalField>
元素的 format
属性为 STRING
(默认),则其值不会被插值,相当于添加一个文字:
"userId3": "%userId"
每个日志事件。
如果要插入值,则需要使用
JSON
作为格式并使用 模式模板解析器:
<EventTemplateAdditionalField key="userId3"
value='{"$resolver": "pattern", "pattern": "%userId", "stackTraceEnabled": false}'/>
相当于添加:
"userId3": {
"$resolver": "pattern",
"pattern": "%userId",
"stackTraceEnabled": false
}
您的模板配置