需要通过logstash中的grok筛选器自定义日志字段

需要通过logstash中的grok筛选器自定义日志字段,logstash,logstash-grok,Logstash,Logstash Grok,我的系统上安装了logstash、kibana和elasticsearch,过滤器配置如下: filter{ if [type] == "syslog" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?:

我的系统上安装了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上接收输出为:

但我需要一些字段,如下所示: @时间戳 @版本 _身份证 _索引 _类型 _文件 日志级别 主机名 主机名称 进程名称 响应时间

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


您将模式与字段混淆了

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

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

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

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

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

  • 创建一个新模式来替换所有的SYSLOGTIMESTAMP,这将使字段成为信息片段
  • 使用现有模式创建syslog_timestamp字段,然后使用一个简单的模式将其拆分
  • 我推荐#2,这样你就会得到这样的结果:

    grok {
          match => { "syslog_timestamp" => "%{MONTH:month} +%{MONTHDAY:monthday} %{TIME:time}" }
    }
    
    应该这样做

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


    祝你好运。

    好的,我知道了,但是如何显示与日志级别、客户端IP、进程名称等相关的字段。如果要从日志中提取更多信息,您可以制作更多的grok{}节,制作匹配的模式并创建所需的字段。