1. 程式人生 > >JsonLayout log4j2 json格式輸出日誌

JsonLayout log4j2 json格式輸出日誌

如果日誌輸出時,想改變日誌的輸出形式為Json格式,可以在log4j2.xml中使用JsonLayout標籤,使日誌輸出格式為Json格式。

前提需要Jackson的包,保證專案中包含jackson的依賴

然後在log4j2.xml中在需要日誌輸出的地方,新增

<JsonLayout/>

例如需要在控制檯輸出格式為Json格式則:

 <!--這個輸出控制檯的配置-->
        <Console name="Console" target="SYSTEM_OUT">  
            <JsonLayout/>
</Console>

如果需要在日誌檔案輸出,則為:

         <RollingFile name="syswareLog" fileName="${LOG_HOME}/logs/sysware.log"
                     filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/sysware-%d{yyyy-MM-dd}-%i.log">
            <JsonLayout/>
            <Policies>
                <
TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100000 kb"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了20 --> <DefaultRolloverStrategy max="100"/> </RollingFile>

 

設定完成之後,日誌輸出格式如下:

{
  "timeMillis" : 1547108632526,
  "thread" : "main",
  "level" : "WARN",
  "loggerName" : "com.ctrip.framework.apollo.internals.DefaultMetaServerProvider",
  "message" : "Could not find meta server address, because it is not available in neither (1) JVM system property 'apollo.meta', (2) OS env variable 'APOLLO_META' (3) property 'apollo.meta' from server.properties nor (4) property 'apollo.meta' from app.properties",
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.slf4j.Log4jLogger",
  "threadId" : 1,
  "threadPriority" : 5
}

但是這個日誌是格式化後的json,有同事提出需求,想讓一個json物件輸出為一行,這樣日誌讀取的時候,可以以一個物件為單位讀取,而不是一行。

繼續檢視JsonLayout 原始碼,既然他提供了轉換為json,那是不是也可以提供格式化json規則。

org.apache.logging.log4j.core.layout.JsonLayout 。 繼承自 AbstractJacksonLayout,在AbstractJacksonLayout 中有下面幾個屬性介紹。我們下面主要介紹這幾個屬性的含義及使用方法。

    protected final String eol;
    protected final ObjectWriter objectWriter;
    protected final boolean compact;
    protected final boolean complete;