3

我的系统上安装了 logstash、kibana 和 elasticsearch,并使用了以下过滤器配置:

    filter{
if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    mutate {
            add_field => {
                            "timestamp" => "%{TIME} %{MONTH} %{monthday}"
                         }
        }

    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

并在 kibana 上接收输出为: Kibana 输出

但我需要一些如下字段:@timestamp @version _id _index _type _file 日志级别主机名主机IP 进程名称响应时间

我尝试添加时间戳,但它打印相同的字符串而不是动态结果

Kibana 输出

4

1 回答 1

0

您将模式与字段混淆了。

模式是表示正则表达式的简写符号,例如 %{WORD} 作为“\b\w+\b”的快捷方式。

字段是存储数据(包括与模式匹配的信息)的地方。可以将模式放入这样的字段中:%{WORD:my_field}

在您的 grok{} 中,您匹配:%{SYSLOGTIMESTAMP:syslog_timestamp},它将所有匹配的内容放入一个名为 syslog_timestamp 的字段中。这是在系统日志消息前面看到的月份、月份和时间。

尽管 SYSLOGTIMESTAMP 本身定义为“%{MONTH} +%{MONTHDAY} %{TIME}”,但它们没有“:name”语法,因此没有为 MONTH、MONTHDAY 和 TIME 创建字段。

假设您确实想以您描述的格式创建一个新字段,您需要:

  1. 创建一个新模式来替换所有 SYSLOGTIMESTAMP,这将使字段脱离信息片段。
  2. 使用现有模式创建 syslog_timestamp 字段,然后使用简单的模式将其拆分。{}

我推荐#2,所以你最终会得到这样的结果:

grok {
      match => { "syslog_timestamp" => "%{MONTH:month} +%{MONTHDAY:monthday} %{TIME:time}" }
}

那应该这样做。

请注意,您的字段将是一个字符串,因此在范围查询等中没有任何用处。您应该使用 date{} 过滤器将 @timestamp 替换为您的 syslog_timestamp 信息。

祝你好运。

于 2015-01-22T07:26:06.390 回答