2 回答
TA贡献1815条经验 获得超6个赞
将 "locationInfo="true" " 添加到 Log4j2 配置文件中的 JSON 属性: 例如:
<JsonLayout complete="false" locationInfo="true" properties="true" propertiesAsList="true" eventEol="true">
TA贡献1802条经验 获得超6个赞
我们还没有找到制作JsonLayout输出类、行和方法的方法,我们采用的解决方法是实现我们自己的布局,基本上创建一个新的自定义布局插件,因为它基本上是 JsonLayout 类的副本,并增加了对模式的支持:
@Plugin(name = "CustomJsonLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class CustomJsonLayout extends AbstractJacksonLayout {
其中在其构造函数中添加了参数:
final boolean stacktraceAsString,
final boolean includeNullDelimiter,
final KeyValuePair[] additionalFields,
final boolean objectMessageAsJsonObject
然后当然也将它们添加到super呼叫中。
最大的变化是通过覆盖该toSerializable(final LogEvent event, final Writer writer)方法并添加私有方法customFunctionToApplyPatternConversion,该方法看起来类似于:
Object wrappedEvent = wrapLogEvent(convertMutableToLog4jEvent(event));
if (wrappedEvent instanceof LogEventWithAdditionalFields) {
LogEventWithAdditionalFields eventWithAdditionalFields = (LogEventWithAdditionalFields) wrappedEvent;
eventWithAdditionalFields = customFunctionToApplyPatternConversion(event, eventWithAdditionalFields);
wrappedEvent = eventWithAdditionalFields;
}
objectWriter.writeValue(writer, wrappedEvent);
大多数东西都是在customFunctionToApplyPatternConversion方法内部完成的,但我不能发布,因为我没有被授权。
这是如何添加对检测模式的支持并将其替换为值的总体思路。如果您查看 JsonLayout 类和 PatternLayout 类的完整代码,您可以更好地掌握这一点 - 这实际上是将它们合并在一起,然后在 log4j2.xml 中指定 CustomJsonLayout 而不是默认的。
添加回答
举报