我的系统上安装了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上接收输出为:
但我需要一些字段如下: @timestamp @版 _ID _指数 _类型 _文件 日志级别 主机名 主机IP 进程名称 响应时间
我尝试添加Timestamp但是打印相同的字符串而不是动态结果
答案 0 :(得分:0)
您将模式与字段混淆。
模式是表示正则表达式的简写符号,例如%{WORD}作为" \ b \ w + \ b"的快捷方式。
字段是存储数据(包括与模式匹配的信息)的位置。可以将模式放入这样的字段:%{WORD:my_field}
在你的grok {}中,你匹配:%{SYSLOGTIMESTAMP:syslog_timestamp},它将匹配的所有内容放入一个名为syslog_timestamp的字段中。这是在syslog消息前面看到的月,月和时间。
即使SYSLOGTIMESTAMP本身定义为"%{MONTH} +%{MONTHDAY}%{TIME}",他们也没有":name"语法,因此不会为MONTH,MONTHDAY和TIME创建任何字段。
假设您确实想要以您描述的格式制作新字段,您需要:
我建议#2,所以你最终会得到这样的结果:
grok {
match => { "syslog_timestamp" => "%{MONTH:month} +%{MONTHDAY:monthday} %{TIME:time}" }
}
应该这样做。
请注意,您的字段将是一个字符串,因此它不会在范围查询等中使用。您应该使用date {}过滤器将@timestamp替换为您的syslog_timestamp信息。
祝你好运。