亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Log4J2 JsonLayout 打印出類、方法和行以及 @timestamp 覆蓋

Log4J2 JsonLayout 打印出類、方法和行以及 @timestamp 覆蓋

瀟瀟雨雨 2021-10-17 10:39:45
所以我們有一個應用程序,我們將把它的所有日志發送到 Kibana 服務器(通過 Kafka 服務器)。以下是我們設法開始工作的基礎知識,發布到 Kibana 沒有問題:        <Kafka name="KafkaAppender" topic="topic1">        <JsonLayout compact="true">            <KeyValuePair key="service" value="some_app_tag"/>            <KeyValuePair key="@timestamp" value="${date:yyyy-MM-dd HH:mm:ss.SSS}"/>            <KeyValuePair key="host_name" value="${hostName}"/>            <KeyValuePair key="unique_id" value="$${map:name:-NA}"/>    </JsonLayout>        <Property name="bootstrap.servers">kafka1.com:9092,kafka2.com:9092,kafka3.com:9092</Property>    </Kafka>然而,我們發現很難在 中打印出類、方法和行號,JsonLayout以便它可以被 elasticSearch 索引,因此可以在 Kibana 中作為一個字段進行搜索。我們為這 3 個字段嘗試了各種語法組合/變體,例如%c{2},%M和%LLine - 它們都按字面意義打印出來,作為我們嘗試放入的變量。在 Console Appender 中,它們使用: <pattern>%23.23d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] [$${map:name:-NA}] %c{1}.%M(%F:%L): %highlight{%m%n%throwable}</pattern>"$${map:name:-NA}" 是我們添加的東西,用于添加可以根據用戶收到的錯誤消息搜索的唯一錯誤 ID,它由以下內容設置:    StringMapMessage mapMsg = new StringMapMessage();    mapMsg.put("name", "arun");    LOGGER.fatal(mapMsg);這有效,我們唯一的問題是在 JSON 中為 Kafka 輸入輸出類、行和方法到目前為止,我們無法覆蓋 Kibana 的@timestamp字段,因此它包含 log4j 生成的時間戳,以便我們可以可靠地按生成日志的時間/日期排序(否則,如果它們以隨機順序出現,它們會令人困惑) - 當我們添加了@標志,Kibana 添加了一個標簽,如_timestampparsefailure,并顯示提交@timestamp的_@timestamp,而不是使用它來覆蓋它生成的時間戳。任何人都可以請教嗎?我們已經搜索了很遠很遠,到目前為止還沒有找到任何接近的東西。謝謝。
查看完整描述

2 回答

?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

將 "locationInfo="true" " 添加到 Log4j2 配置文件中的 JSON 屬性: 例如:

<JsonLayout complete="false" locationInfo="true" properties="true" propertiesAsList="true" eventEol="true">



查看完整回答
反對 回復 2021-10-17
?
呼啦一陣風

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 而不是默認的。


查看完整回答
反對 回復 2021-10-17
  • 2 回答
  • 0 關注
  • 920 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號