如何在log4j的JSON布局中为每个消息生成UUID?



我需要为每个日志消息的相关键生成一个随机字符串,我发现有一种方法可以在log4j配置文件中生成UUID。https://logging.apache.org/log4j/2.x/manual/layouts.html 上提到了UUID,但没有说明如何使用它。

我正在尝试将其设置为我的 Json布局中的键的值。

appender.rolling.layout.external-correlation-id.type = KeyValuePair
appender.rolling.layout.external-correlation-id.key = external-correlation-id
appender.rolling.layout.external-correlation-id.value = %u{"RANDOM"}

但这无济于事。它只是在日志消息中添加文本字符串... "external-correlation-id":"%u{"RANDOM"}" ...

如何获取随机字符串以在日志消息中设置它?有没有办法让我至少直接调用 thelog4j 属性文件中的UUID.randomUUID()

我不想为此使用 MDC,并且正在寻找一种直接从 log4j 配置文件执行此操作的方法。

任何其他帮助将不胜感激。

我已经使用自定义StrLookup在KeyValuePair的JsonLayout中做了类似的事情。

下面的代码显示了每次使用自定义查找记录消息时返回 UUID 的简单示例。人们会添加每个键等具有不同操作的功能,但这有效。

import java.util.UUID;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;
@Plugin(name = "dyn", category = "Lookup")
public class DynamicLookup implements StrLookup {
  @Override
  public String lookup(String key) {
    if("uuid".equals(key)) {
      return UUID.randomUUID().toString();
    } else {
      return null;
    }
  }
  @Override
  public String lookup(LogEvent event, String key) {
    if("uuid".equals(key)) {
      return UUID.randomUUID().toString();
    } else {
      return null;
    }
  }
}

然后使用双精度 $$ 引用查找,以使该值评估每条消息,而不仅仅是一次。

<KeyValuePair key="event_id" value="$${dyn:uuid:-}"/>

最新更新