我需要为每个日志消息生成一个用于关联密钥的随机字符串,我发现有一种方法可以在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配置文件中执行此操作的方法。
在此方面的其他帮助将不胜感激。
答案 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:-}"/>