JsonTemplateLayout (log4j2) 无法从 LogEventPatternConverter (log4j2) 解析 ConverterKey

问题描述 投票:0回答:1

问题:ConverterKey 未得到解决

我想用 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>
spring logging log4j2
1个回答
0
投票

如果

<EventTemplateAdditionalField>
元素的
format
属性为
STRING
(默认),则其值不会被插值,相当于添加一个文字:

"userId3": "%userId"

每个日志事件。

如果要插入值,则需要使用

JSON
作为格式并使用 模式模板解析器:

<EventTemplateAdditionalField key="userId3"
                              value='{"$resolver": "pattern", "pattern": "%userId", "stackTraceEnabled": false}'/>

相当于添加:

"userId3": {
    "$resolver": "pattern",
    "pattern": "%userId",
    "stackTraceEnabled": false
}

您的模板配置

© www.soinside.com 2019 - 2024. All rights reserved.