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 而不是默認的。
添加回答
舉報