elasticsearch 当通过logstash进入Elasticsearch时,如何创建JSON格式的日志,elasticsearch,logstash,kibana,elasticsearch,Logstash,Kibana" /> elasticsearch 当通过logstash进入Elasticsearch时,如何创建JSON格式的日志,elasticsearch,logstash,kibana,elasticsearch,Logstash,Kibana" />

elasticsearch 当通过logstash进入Elasticsearch时,如何创建JSON格式的日志

elasticsearch 当通过logstash进入Elasticsearch时,如何创建JSON格式的日志,elasticsearch,logstash,kibana,elasticsearch,Logstash,Kibana,我被告知,通过使用logstash管道,我可以在进入elasticsearch时重新创建日志格式(即JSON)。但是不知道怎么做 当前LOGStash配置(我从Google获取了以下信息,并非出于任何特殊原因) 我有两个日志文件位于 /root/logs/File.log /root/logs/File2.log 那里的日志格式是: 08:26:51,753 DEBUG [ABC] (default-threads - 78) (1.2.3.4)(368)>[TIMESTAMP:Wed S

我被告知,通过使用logstash管道,我可以在进入elasticsearch时重新创建日志格式(即JSON)。但是不知道怎么做

当前LOGStash配置(我从Google获取了以下信息,并非出于任何特殊原因)

我有两个日志文件位于

/root/logs/File.log /root/logs/File2.log

那里的日志格式是:

08:26:51,753 DEBUG [ABC] (default-threads - 78) (1.2.3.4)(368)>[TIMESTAMP:Wed Sep 11 08:26:51 UTC 2019],[IMEI:03537],[COMMAND:INFO],[GPS STATUS:true],[INFO:true],[SIGNAL:false],[ENGINE:0],[DOOR:0],[LON:90.43],[LAT:23],[SPEED:0.0],[HEADING:192.0],[BATTERY:100.0%],[CHARGING:1],[O&E:CONNECTED],[GSM_SIGNAL:100],[GPS_SATS:5],[GPS POS:true],[FUEL:0.0V/0.0%],[ALARM:NONE][SERIAL:01EE]
在Kibana中,默认情况下,它显示为ethis

但我想像下面那样得到:

"message": {
      "TIMESTAMP": "Sat Sep 07 21:33:42 UTC 2019",
      "TEST": "123456",
      "CMD":INFO,
      "STATUS":true,
      "INFO":true,
      "SIGNAL":false,
      "ABC":0,
      "DEF":0,
      "GHK":0,
      "GHK":1111
    }
这能做到吗?如果是,怎么做?
感谢使用
如果[message]=~/>/
,则过滤器将仅适用于包含
的邮件。解剖筛选器将在
之间分割消息。kv过滤器将在消息的第二部分应用键值转换,删除
[]
。mutate.remove_字段删除任何额外字段

filter {
    if [message] =~ />/ {
        dissect {
            mapping => {
                "message" => "%{start_of_message}>%{content}"
            }
        }

        kv {
            source => "content"
            value_split => ":"
            field_split => ","
            trim_key => "\[\]"
            trim_value => "\[\]"
            target => "message"
        }

        mutate {
            remove_field => ["content","start_of_message"]
        }
    }
}
结果,使用提供的日志行:

{
  "@version": "1",
  "host": "YOUR_MACHINE_NAME",
  "message": {
    "DEF": "0",
    "TIMESTAMP": "Sat Sep 07 21:33:42 UTC 2019",
    "TEST": "123456",
    "CMD": "INFO",
    "SERIAL": "0006]\r",
    "GHK": "1111",
    "INFO": "true",
    "STATUS": "true",
    "ABC": "0",
    "SIGNAL": "false"
  },
  "@timestamp": "2019-09-10T09:21:16.422Z"
}

除了使用
if[message]=~/>/
进行过滤外,您还可以在文件输入插件设置的
路径
字段上进行比较。另外,如果您有多个文件输入,您可以设置
类型
字段并使用此字段,请参见。

可以这样做。最简单的方法是在>Hi之后的零件上应用kv滤波器,谢谢,但是我在logstatsh Sep 10 14:03:00 kibana logstash[19858]:[2019-09-10T16:03:00262][WARN][org.logstash.dissect.Dissector]Dissector映射中得到了这个错误,{“field=>”message“=>”%{start\u of_message}>%{content}”,这意味着此邮件不包含
。如果您也收到不包含
的邮件,您必须处理这些邮件,要么删除它们,要么不使用我上面编写的筛选器对其进行解析。将这些邮件添加到您的问题中,说明您要对其执行的操作,我将扩展我的答案。谢谢@baudsp,我我正在推送不同类型的日志文件,因此每个日志文件都有不同类型的结构,这可能是原因,是否仍要仅对特定的日志文件应用筛选器?是的。我将用类似的内容更新我的答案。
"message": {
      "TIMESTAMP": "Sat Sep 07 21:33:42 UTC 2019",
      "TEST": "123456",
      "CMD":INFO,
      "STATUS":true,
      "INFO":true,
      "SIGNAL":false,
      "ABC":0,
      "DEF":0,
      "GHK":0,
      "GHK":1111
    }
filter {
    if [message] =~ />/ {
        dissect {
            mapping => {
                "message" => "%{start_of_message}>%{content}"
            }
        }

        kv {
            source => "content"
            value_split => ":"
            field_split => ","
            trim_key => "\[\]"
            trim_value => "\[\]"
            target => "message"
        }

        mutate {
            remove_field => ["content","start_of_message"]
        }
    }
}
{
  "@version": "1",
  "host": "YOUR_MACHINE_NAME",
  "message": {
    "DEF": "0",
    "TIMESTAMP": "Sat Sep 07 21:33:42 UTC 2019",
    "TEST": "123456",
    "CMD": "INFO",
    "SERIAL": "0006]\r",
    "GHK": "1111",
    "INFO": "true",
    "STATUS": "true",
    "ABC": "0",
    "SIGNAL": "false"
  },
  "@timestamp": "2019-09-10T09:21:16.422Z"
}