Logstash + Kibana术语面板不会破坏单词

bru*_*ora 5 java json logstash kibana

我有一个Java应用程序,它以json格式写入日志文件.日志中的字段是可变的.logstash读取此日志文件并将其发送给Kibana.

我已使用以下文件配置了logstash:

input {
        file {
                path => ["[log_path]"]
                codec => "json"
        }
}

filter{
        json {
                source => "message"
        }

        date {
                match => [ "data", "dd-MM-yyyy HH:mm:ss.SSS" ]
                timezone => "America/Sao_Paulo"
        }
}

output {
        elasticsearch_http {
                flush_size => 1
                host => "[host]"
                index => "application-%{+YYYY.MM.dd}"
        }
}
Run Code Online (Sandbox Code Playgroud)

我已经设法在没有任何映射的情况下正确显示Kibana中的所有内容.但是当我尝试创建一个术语面板来显示发送这些消息的服务器的数量时,我遇到了问题.我的json中有一个名为server的字段,显示服务器名称(如:a1-name-server1),但由于" - ",术语面板将服务器名称拆分.此外,我想计算出现错误消息的次数,但出现同样的问题,因为术语面板因空格而拆分错误消息.

我正在使用Kibana 3和Logstash 1.4.我在网上搜索了很多,找不到任何解决方案.我也尝试过使用logstash中的.raw,但它没有用.

我该怎么办呢?

谢谢您的帮助.

Rom*_*man 1

由于您没有在 elasticsearch 中定义映射,因此索引中类型中的每个字段都会采用默认设置。字符串字段(如服务器字段)的默认设置是分析字段,这意味着弹性搜索将标记字段内容。这就是为什么它将您的服务器名称分成几部分的原因。

您可以通过定义映射来解决此问题。您不必定义所有字段,只需定义您不希望 Elasticsearch 分析的字段即可。在您的特定情况下,发送以下 put 命令即可解决问题:

http://[host]:9200/[index_name]/_mapping/[type]

{
    "type" : {
        "properties" : {
            "server" : {"type" : "string", "index" : "not_analyzed"}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您无法对已存在的索引执行此操作,因为从analyze 切换到not_analyzed 是映射中的重大更改。