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 eventEol;
    protected final ObjectWriter objectWriter;
    protected final boolean compact;
    protected final boolean complete;

 

compact 設置是否緊湊輸出,默認是false,如果設置為true,則不是用行位和縮進,大概意思是說,輸出把所有的日志輸出為一行。
     原文( If "true", does not use end-of-lines and indentation, defaults to "false".
complete 設置是否完成,默認是false, 如果設置為true,則在日志開始和結束會包含頁眉和頁腳,和逗號。
    原文(If "true", includes the JSON header and footer, and comma between records.)
eventEol 如果為“true”,則在每個日志事件后強制執行EOL(即使compact是“true”),默認是false,即使在緊湊模式下,也會生效,大概意思就是說,
     即使是在緊湊模式下,如果evetEol設置為true ,也會在每個log event(log.info().log.error(),log.debug()等等)之后強制換行輸出。
objectWriter 暫不清楚

通過上面的屬性介紹,根據需要,只需將compact ,evetEol 設置成true,即可將每行日志輸出成一行json。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM