分层数据匹配和显示

时间:2016-03-23 21:02:15

标签: elasticsearch logstash kibana elastic-stack

在我的日志文件中,我有表示项目层次结构的数据,就像http日志文件可能显示网站的层次结构一样。

我可能有这样的数据

41 2016-01-01 01:41:32-500 show:category:all
41 2016-01-01 04:11:20-500 show:category:animals
42 2016-01-02 01:41:32-500 show:item:wallaby
42 2016-01-02 01:41:32-500 show:home

我在这里有3个项目...... %{NUMBER:terminal} %{TIMESTAMP_ISO8601:ts}(?<info>([^\r])*)

我使用mutatesplit信息数据解析为数组,以将lvl1:lvl2:lvl3转换为['lvl1','lvl2','lvl3']

我有兴趣汇总数据以便轻松获得各种级别的计数,例如计算info[0]相同或info[0]info[1]相同的所有记录。 (并且能够选择时间范围和终端)

有没有办法设置kibana来显示这种信息? 或者我应该更改过滤器匹配数据的方式以使数据更易于访问? 级别的深度各不相同,但我可以肯定最高级别为5,因此我可以将文本解析为各个字段lvl1 lvl2 lvl3 lvl4 {{1而不是把它们放在一个数组中。

2 个答案:

答案 0 :(得分:0)

根据您的问题,我同意您解析数据的方式。但我想补充更多,以使其直接可聚合和放大使用Kibana可视化。

方法应该是: -

  • 使用%{NUMBER:terminal}%{TIMESTAMP_ISO8601:ts}和(?([^ \ r])*)过滤数据{根据您提供的信息}
  • 突变
  • 过滤

然后使用mutate&amp;过滤你将得到数组{如你所提到的}

  • 现在,您可以通过提及add_field =&gt;将字段添加为级别1 [“fieldname”,“%{[arrayname] [0]}”]
  • 现在,您可以通过提及add_field =&gt;将字段添加为级别2 [“fieldname”,“%{[arrayname] [1]}”]
  • 现在,您可以通过提及add_field =&gt;将字段添加为级别3 [“fieldname”,“%{[arrayname] [2]}”]

然后你可以直接使用Kibana来显示这些信息。

答案 1 :(得分:0)

我的解决方案

input {
  file {
      path => "C:/Temp/zipped/*.txt"
      start_position => beginning 
      ignore_older => 0 
      sincedb_path => "C:/temp/logstash_temp2.sincedb"
  }
}

filter {
  grok {
    match => ["message","^%{NOTSPACE}\[%{NUMBER:terminal_id}\] %{NUMBER:log_level} %{NUMBER} %{TIMESTAMP_ISO8601:ts} \[(?<facility>([^\]]*))\] (?<lvl>([^$|\r])*)"]
  }
  mutate {
       split => ["lvl", ":"]
       add_field => {"lvl_1" => "%{lvl[0]}"}
       add_field => {"lvl_2" => "%{lvl[1]}"}
       add_field => {"lvl_3" => "%{lvl[2]}"}
       add_field => {"lvl_4" => "%{lvl[3]}"}
       add_field => {"lvl_5" => "%{lvl[4]}"}
       add_field => {"lvl_6" => "%{lvl[5]}"}
       add_field => {"lvl_7" => "%{lvl[6]}"}
       add_field => {"lvl_8" => "%{lvl[7]}"}
       lowercase => [ "terminal_id" ] # set to lowercase so that it can be used for index - additional filtering may be required
  }
  date {
     match => ["ts", "YYYY-MM-DD HH:mm:ssZZ"]
  }
}
filter {
  if [lvl_1] =~ /%\{lvl\[0\]\}/ {mutate {remove_field => [ "lvl_1" ]}}
  if [lvl_2] =~ /%\{lvl\[1\]\}/ {mutate {remove_field => [ "lvl_2" ]}}
  if [lvl_3] =~ /%\{lvl\[2\]\}/ {mutate {remove_field => [ "lvl_3" ]}}
  if [lvl_4] =~ /%\{lvl\[3\]\}/ {mutate {remove_field => [ "lvl_4" ]}}
  if [lvl_5] =~ /%\{lvl\[4\]\}/ {mutate {remove_field => [ "lvl_5" ]}}
  if [lvl_6] =~ /%\{lvl\[5\]\}/ {mutate {remove_field => [ "lvl_6" ]}}
  if [lvl_7] =~ /%\{lvl\[6\]\}/ {mutate {remove_field => [ "lvl_7" ]}}
  if [lvl_8] =~ /%\{lvl\[7\]\}/ {mutate {remove_field => [ "lvl_8" ]}}
  mutate{
    remove_field => [ "lvl","host","ts" ] # do not keep this data
  }
}


output {
  if [facility] == "mydata" {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "logstash-mydata-%{terminal_id}-%{+YYYY.MM.DD}"
    }
  } else {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "logstash-other-%{terminal_id}-%{+YYYY.MM.DD}"
    }
  }
  # stdout { codec => rubydebug }
}