2017-11-10 68 views
0

如何將自定義參數添加到Log4j2的JSONLAYOUT?Log4J2 JSONLAYOUT如何添加自定義參數

還有一種方法可以將模式添加到JSONLAYOUT的消息元素?

我試圖在這裏列出的選項 - >
logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout

請幫幫忙!

+0

https://logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout –

+0

@DB謝謝。我已經檢查了正確的鏈接,並沒有找到如何添加自定義參數。問題是關於添加自定義參數,這在該鏈接中未提及。 – TuneIt

+0

您能否通過添加自定義參數來澄清您的意思? –

回答

2

據我所知,您正在尋找一種方法來定製JSONLayout的JSON輸出格式,方式類似於您可以通過指定「轉換模式」來自定義PatternLayout

我相信答案是你不能以相同的方式定製JSONLayout。您可以可以選擇您想要包含在郵件中的各種信息。例如,示出了documentationproperties參數:

如果爲真,在附加器包括在所生成的JSON線程上下文映射。默認爲false。

因此,您可以設置各種參數以包含某些類型的信息,但是您不能直接控制包含的特定項目。

可能做的是使用ObjectMessage以及JSON庫來生成JSON消息。但是,這會在JSON中生成JSON(假設您仍然希望使用JSONLayout這種方法)。下面是一些示例代碼來說明:

一類與主方法,以產生一個日誌消息:

package example; 

import java.util.HashMap; 
import java.util.Map; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.json.JSONObject; 

public class JsonMessageExample { 

    private static final Logger log = LogManager.getLogger(); 

    public static void main(String[] args) { 
     Map<String,String> msgMap = new HashMap<>(); 
     msgMap.put("myKey", "myValue"); 
     JSONObject message = new JSONObject(msgMap); 
     log.info(message); 
    } 
} 

的log4j2.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <JSONLayout/> 
     </Console> 

    </Appenders> 

    <Loggers> 
     <Root level="debug"> 
      <AppenderRef ref="Console"/> 
     </Root> 
    </Loggers> 
</Configuration> 

從上述輸出:

{ 
    "timeMillis" : 1510429852038, 
    "thread" : "main", 
    "level" : "INFO", 
    "loggerName" : "example.JsonMessageExample", 
    "message" : "{\"myKey\":\"myValue\"}", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 1, 
    "threadPriority" : 5 
} 

正如您所看到的,消息名稱值對具有一個值爲JSON字符串的值。爲了解析這個,你必須將外部對象解析爲JSON,拉取消息字段,然後將其值解析爲JSON。

然而,如果使用不同的佈局,例如一個非常基本的PatternLayout這樣的:<PatternLayout pattern="%m%n"/>

您將能夠產生只有一個級別JSON輸出,因此只需要解析一次。但是,您必須編寫邏輯來獲取所需的信息並將其填入地圖(和JSON對象),因爲現在您只需簡單地轉儲地圖的內容即可。使用相同的Java代碼與佈局

示例輸出變爲PatternLayout如上所述:

{"myKey":"myValue"}

編輯:

,如果你想用你甚至可以這樣做以下PatternLayout的「轉換模式」,以JSON格式輸出日誌,而不必編寫邏輯來獲取一些具體信息:

<PatternLayout pattern="{&quot;timeMillis&quot;:&quot;%d{UNIX_MILLIS}&quot;,&quot;thread&quot;:&quot;%t&quot;,&quot;level&quot;:&quot;%p&quot;,&quot;loggerName&quot;:&quot;%c&quot;,&quot;message&quot;:%m}%n"/>

示例輸出:

{ 「timeMillis」: 「1510455694601」, 「線程」: 「主」, 「水平」: 「信息」, 「loggerName」: 「example.JsonMessageExample」,」消息「:{」myKey「:」myValue「}}

+0

感謝您的建議。有沒有其他方法可以將自定義參數添加到「JSONLayout」中? – TuneIt

+1

您可以編寫自己的佈局 –

+0

@ D.B。如何編寫自定義佈局? –

相關問題