2016-07-27 10 views
2

Я пытаюсь выставить мой регистратор в формате JSON, чтобы я мог использовать необходимость использования фильтров в стеке ELK. Кажется, он работает.Формат java выходит в JSON для использования в стеке ELK

Вот что у меня есть

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.json.simple.JSONObject; 

public class MyApp { 

    static Logger logger = LoggerFactory.getLogger(MyApp.class); 

    @SuppressWarnings("unchecked") 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JSONObject obj = new JSONObject(); 
     JSONObject obj2 = new JSONObject(); 


     obj.put("name","foo"); 
     obj.put("num",new Integer(100)); 
     obj.put("balance",new Double(1000.21)); 
     obj.put("is_vip",new Boolean(true)); 

     obj2.put("ob2name","bar"); 
     obj2.put("ob2num",new Integer(200)); 

     obj.put("names", obj2); 


     logger.info("{}", obj); 

    } 

} 

Вывод на мой file.log

{"@timestamp":"2016-07-27T17:51:08.331+01:00","@version":1,"thread_name":"main","logger_name":"MyApp","level":"INFO","level_value":20000,"HOSTNAME":"gman","message":"{\"names\":{\"ob2num\":200,\"ob2name\":\"bar\"},\"balance\":1000.21,\"is_vip\":true,\"num\":100,\"name\":\"foo\"}"} 

Вывод на консоль logstash

{ 
    "@timestamp" => "2016-07-27T16:51:08.331Z", 
     "@version" => 1, 
    "thread_name" => "main", 
    "logger_name" => "MyApp", 
      "level" => "INFO", 
    "level_value" => 20000, 
     "HOSTNAME" => "gman", 
     "message" => "{\"names\":{\"ob2num\":200,\"ob2name\":\"bar\"},\"balance\":1000.21,\"is_vip\":true,\"num\":100,\"name\":\"foo\"}", 
      "host" => "gman", 
      "path" => "C:\\apps\\dots\\logs\\file.log" 
} 

Мой вопрос

Похоже, что сообщение выводится как строка, как я могу выставить его как JSON, чтобы Elasticsearch мог подбирать отдельные поля и индексировать их, чтобы они могли быть доступны для поиска?

ответ

1

В файле конф Logstash, добавьте JSon фильтр:

filter { 
    json { 
     source => message 
    } 
}