本文介紹了Log4j2 JSON布局:在UTC中添加自定義日期字段的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
Log4j2支持JSON Layout,其中我在log4j2.xml中添加了一個額外的定制字段:
<JsonLayout compact="true" eventEol="true" stacktraceAsString="true">
<KeyValuePair key="@timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}"/>
</JsonLayout>
一般來說,一切正常,但此日志由Filebeats處理,并假定該日期以UTC表示。
所有日志條目都具有當地時區的日期值。
是否可以以UTC格式輸出日期?
推薦答案
您可以create your own lookup,因為我相信您已經知道,KeyValuePair
支持根據manual page you shared在其值屬性中進行查找。
出于示例目的,我創建了一個使用System.currentTimeMillis()的簡單查找。
以下是示例代碼:
首先,查找類:
package utcTime;
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 = "UtcMillis", category = "Lookup")
public class UtcMillisLookup implements StrLookup{
/**
* Lookup the value for the key.
* @param key the key to be looked up, may be null
* @return The value for the key.
*/
public String lookup(String key) {
return String.valueOf(getUTCMillis());
}
/**
* @return current UTC time in milliseconds
*/
private long getUTCMillis(){
return System.currentTimeMillis();
}
/**
* Lookup the value for the key using the data in the LogEvent.
* @param event The current LogEvent.
* @param key the key to be looked up, may be null
* @return The value associated with the key.
*/
public String lookup(LogEvent event, String key) {
return String.valueOf(getUTCMillis());
}
}
接下來,log4j2.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<JsonLayout compact="true" eventEol="true" stacktraceAsString="true">
<KeyValuePair key="@timestamp" value="$${UtcMillis:}"/>
</JsonLayout>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
請注意,查找沒有參數/鍵,因此您可以將該部分保留為空/空白,但您仍然必須使用冒號(:
),這就是您在上面的配置中看到$${UtcMillis:}
的原因。
最后,生成日志事件的簡單類:
package utcTime;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MainUtcLookup {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args){
log.info("Here's some info!");
}
}
以下是示例輸出:
{
"thread":"main",
"level":"INFO",
"loggerName":"utcTime.MainUtcLookup",
"message":"Here's some info!",
"endOfBatch":false,
"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger",
"instant":{
"epochSecond":1534642997,
"nanoOfSecond":556000000
},
"threadId":1,
"threadPriority":5,
"@timestamp":"1534642997558"
}
我不打算深入研究您可以獲得以UTC毫秒為單位的當前時間的所有不同方法的細節,因為我相信您可以自己研究這一細節。我只是想提供一個示例,說明如何實現將毫秒時間戳添加到log4j2JSONLayout
的主要目標。
希望這能有所幫助!
這篇關于Log4j2 JSON布局:在UTC中添加自定義日期字段的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,