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

时间:2019-06-11 10:20:26

标签: java logging log4j log4j2 uuid

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

我试图将其设置为JsonLayout中键的值。

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\"}" ...中。

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

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

在此方面的其他帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我已经使用自定义StrLookup在KeyValuePair的JsonLayout中完成了类似的操作。

下面的代码显示了一个简单的示例,该示例在每次使用自定义Lookup记录消息时返回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:-}"/>