将JSON文件导入Logstash + Elasticsearch + Kibana

13

所以,我有一个Web平台,每个请求都会打印一个JSON文件,其中包含有关该请求的一些日志数据。 我可以配置多个规则,关于何时记录日志,仅在特定级别记录日志等等......

现在,我一直在玩 Logstash + Elasticsearch + Kibana3 堆栈,并且我很想找到一种方法在 Kibana 中查看这些日志。我的问题是,是否有办法使 Logstash 导入这些类型的文件,还是我必须为此编写自定义输入插件?我已经搜索过了,就我所见,插件是用 Ruby 编写的,而这是我没有经验的语言。

3个回答

24

Logstash是用于处理动态文件的非常好的工具。

以下是使用Logstash将您的json文件导入Elasticsearch的方法:

配置文件:

input 
{
    file 
    {
        path => ["/path/to/json/file"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
    }
}

filter 
{
    mutate
    {
        replace => [ "message", "%{message}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/
    {
        json { source => message }
    }

}

output
{ 
  elasticsearch {
    protocol => "http"
    codec => json
    host => "localhost"
    index => "json"
    embedded => true
  }

    stdout { codec => rubydebug }
}

JSON文件示例:

{"foo":"bar", "bar": "foo"}
{"hello":"world", "goodnight": "moon"}

请注意,JSON需要在一行内。如果您想解析多行JSON文件,请在配置文件中替换相关字段:

   input 
{   
    file 
    {
        codec => multiline
        {
            pattern => '^\{'
            negate => true
            what => previous                
        }
        path => ["/opt/mount/ELK/json/*.json"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
    }
}

filter 
{
    mutate
    {
        replace => [ "message", "%{message}}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/ 
    {
        json { source => message }
    }

}

第一个配置不起作用。:response => {"create" => {"_index" => "fb", "_type" => "logs", "_id" => "AVZUyqwOVPEDPgwGc4_k", "status" => 400, "error" => {"type" => "mapper_parsing_exception", "reason" => "解析失败", "caused_by" => {"type" => "illegal_state_exception", "reason" => "混合字段类型:类org.elasticsearch.index.mapper.core.StringFieldMapper $ StringFieldType!=类org.elasticsearch.index.mapper.internal.IdFieldMapper $ IdFieldType在字段_id上"}}}}, :level => :warn} - KevinOelen
@griffon_vulture,您能详细解释一下filter{}的作用吗? - B--rian

16

Logstash是一种将各种syslog文件转换为JSON并将其加载到elasticsearch(或graphite等)中的工具。

由于您的文件已经是JSON格式,因此您不需要使用Logstash,可以使用curl直接将它们上传到elasticsearch。

请参见将JSON文件导入/索引到Elasticsearch

但是,为了与Kibana良好配合,您的JSON文件需要至少符合以下要求:

  1. Flat - Kibana不支持嵌套的JSON结构。您需要一个简单的键值对哈希表。

  2. 具有可识别的时间戳。

我建议查看Logstash输出的JSON文件,并尝试调整您的JSON文件以匹配该结构。您可以在任何支持JSON的编程语言中完成这项任务。程序 jq 非常方便,可以将JSON从一种格式过滤到另一种格式。

Logstash格式 - https://gist.github.com/jordansissel/2996677

jq - http://stedolan.github.io/jq/


我们是在说logstash不能处理大量只有单个JSON条目的文件吗?否则,现在你必须确定是否有多于1行,使用curl,或者导入到Logstash中。毫无疑问,从Logstash的角度来看,单行文件与其他文件没有任何区别。 - Dominic Zukiewicz
我并不是在谈论logstash和json文件。我只是想说,如果logstash不能满足你的需求,并且数据已经以JSON格式存在,那么做起来就很容易了,可以实现logstash的功能。 - Fred the Magic Wonder Dog
@FredtheMagicWonderDog 关于嵌套的JSON输入,我想跟进一下。您是说我需要在使用Logstash之前将它们展平吗?我该如何做到这一点?请查看https://stackoverflow.com/questions/56293134/importing-nested-json-documents-into-elasticsearch-and-making-them-searchable以了解更多关于我的挑战的信息。 - B--rian

1

Logstash可以导入不同的格式和来源,因为它提供了许多插件。还有其他日志收集器和转发工具,例如nxlog, rsyslog, syslog-ng, flume, kafka, fluentd等,可以将日志发送到logstash。据我所知,大多数人在Windows上使用nxlog(尽管它在Linux上同样有效),与ELK堆栈结合使用,因为它的资源占用率很低。(免责声明:我与该项目有关)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接