Logstash + Kibana术语面板,不打断单词 - java

我有一个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}"
        }
}

我设法正确显示了Kibana中的所有内容,而没有任何映射。
但是,当我尝试创建一个条件面板以显示发送那些消息的服务器数量时,我遇到了问题。
我在json中有一个名为server的字段,其中显示了服务器名称(例如:a1-name-server1),但是术语面板将服务器名称分割为“-”。
另外,我想计算出现错误消息的次数,但是会出现相同的问题,因为术语面板由于空格而将错误消息分割开了。

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

我该如何处理?

谢谢您的帮助。

参考方案

这里的问题是您的数据正在被标记。这有助于对您的数据进行任何搜索。 ES(默认情况下)会将您的字段message拆分为不同的部分,以便能够对其进行搜索。例如,您可能想在日志中搜索单词ERROR,因此您可能希望在结果消息中看到“集群中存在错误”或“错误处理任何内容”消息。如果您不使用tokenizers分析该字段的数据,则将无法进行这样的搜索。

当您要搜索内容时,这种经过分析的行为很有帮助,但是当您具有相同内容的不同消息时,它不允许您进行分组。这是您的用例。解决方案是更新您不想将其拆分为令牌的特定字段的映射not_analyzed。这可能对您的host字段有效,但可能会中断搜索。

对于这种情况,我通常会使用index templates和multifields。索引模板允许我为与正则表达式匹配的每个索引设置映射,而多字段允许我在同一字段中具有analyzednot_analyzed行为。

使用以下查询可以解决您的问题:

curl -XPUT https://example.org/_template/name_of_index_template -d '
{
    "template": "indexname*",
    "mappings": {
        "type": {
            "properties": {
               "field_name": {
                  "type": "multi_field",
                  "fields": {
                     "field_name": {
                         "type": "string",
                         "index": "analyzed"
                     },
                     "untouched": {
                         "type": "string",
                         "index": "not_analyzed"
                     }                      
                 }
            }
        }
    }
}'

然后,在术语面板中,可以使用field.untouched在计算不同元素的数量时考虑字段的全部内容。

如果您不想使用索引模板(也许您的数据在单个索引中),则使用Put Mapping API设置映射也可以完成这项工作。而且,如果您使用多字段,则无需为数据重新索引,因为从为索引设置新映射的那一刻起,新数据将在这两个子字段(field_namefield_name.untouched)中重复。如果您只是将映射从analyzed更改为not_analyzed,则在重新索引所有数据之前,您将看不到任何更改。

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Java和C++共享内存 - java

我有一段创建共享内存的C++代码。是否可以编写Java代码来读取C++代码创建的内存,除非使用JNI。顺便说一句,我正在使用Windows操作系统。 参考方案 请参见MappedByteBuffer。这是读写共享内存的标准Java类。我经常使用。是的,您可以使用它与使用共享内存以任何语言编写的任何程序进行通信,并且这都是非常标准的Java,没有JNI。

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

我可以使用JNI在Java代码中引用C++对象吗? - java

我在任何地方都没有看到(或者也许我很简单,没有看到它),但是有没有办法使用JNI返回c / c ++对象并在Java中使用该对象?例如(非常简单):class simpleClass{ ... private: int intVar; public: int getIntVar(); void setIntVar(int someNum); ... } 在我…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…