简体   繁体   English

格式化java以JSON格式注销以在ELK Stack中使用

[英]Format java logs out in JSON to use in ELK Stack

I am trying to out put my logger in JSON format so I can elimate the need to use filters in my ELK Stack. 我试图将我的记录器放在JSON格式中,这样我就可以在ELK Stack中使用过滤器。 It does seem to work. 它确实有效。

Here is what I have 这就是我所拥有的

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);

   }

}

Output to my file.log 输出到我的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\"}"}

Output to logstash Console 输出到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"
}

My Question 我的问题

The message seem to be out-put as a String how can I out-put it as JSON so Elasticsearch can pick up the individual fields and index them so they can be searchable? 该消息似乎作为String输出如何将其作为JSON输出,以便Elasticsearch可以获取单个字段并将其编入索引以便可以搜索它们?

In your Logstash's conf file, add the json filter: 在Logstash的conf文件中,添加json过滤器:

filter {
    json {
        source => message
    }
}

Alternatively use a Map and do somethink like this: 或者使用Map并做一些像这样的思考:

Map<String, Object> map = new HashMap<>();
map.put("system", "fedora");
logger.info(Markers.appendEntries(map), "Hello world");

for 对于

{
  "message" : "Hello world",
  "system" : "fedora"
}

(default fields omitted). (省略了默认字段)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM