【问题标题】:Import JSON Files into Logstash + Elasticsearch + Kibana将 JSON 文件导入 Logstash + Elasticsearch + Kibana
【发布时间】:2014-09-22 15:10:05
【问题描述】:

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

现在,我一直在玩 Logstash + Elasticsearch + Kibana3 堆栈,我很想找到一种在 Kibana 中查看这些日志的方法。我的问题是,有没有办法让 Logstash 导入这些文件,或者我必须为它编写一个自定义输入插件?我四处搜索,发现插件是用 Ruby 编写的,这是一种我没有经验的语言。

【问题讨论】:

    标签: json logging elasticsearch logstash kibana


    【解决方案1】:

    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"=>"failed to parse", "caused_by"=>{"type"=>"illegal_state_exception", "reason"=>"混合字段类型:类 org. elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType != class org.elasticsearch.index.mapper.internal.IdFieldMapper$IdFieldType on field _id"}}}}, :level=>:warn}
    • @griffon_vulture 能否详细说明一下 filter{} 究竟做了什么?
    【解决方案2】:

    Logstash 只是将各种系统日志文件转换为 JSON 并将它们加载到 elasticsearch(或石墨,或...)的工具。

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

    Import/Index a JSON file into Elasticsearch

    但是,为了与 Kibana 良好配合,您的 JSON 文件至少需要达到最低要求。

    1. Flat - Kibana 无法理解嵌套的 JSON 结构。您需要一个简单的键/值对散列。

    2. 有一个可识别的时间戳。

    我的建议是查看 JSON 文件 logstash 输出,看看是否可以调整 JSON 文件以匹配该结构。你可以用任何你喜欢的语言做到这一点 像那样支持JSON。 jq 程序对于将 json 从一种格式过滤到另一种格式非常方便。

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

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

    【讨论】:

    • 我们是说logstash 不能处理包含单个JSON 条目的大量文件吗?否则,现在您必须确定是否有超过 1 行,使用 curl,或者导入 Logstash。从 Logstash 的角度来看,单行文件肯定没有什么不同吗?
    • 我对logstash和json文件一无所知。我只是说,如果logstash 不能做你想做的事,而且如果数据已经在JSON 中,那么做logstash 做的事情就相当简单了。
    • @FredtheMagicWonderDog 对嵌套 JSON 输入的跟进。你是说我必须先将它们展平?我如何使用 Logstash 做到这一点?请查看stackoverflow.com/questions/56293134/… 了解有关我的挑战的更多信息。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2019-04-14
      相关资源
      最近更新 更多