我在使用logstash过滤器时遇到了一个奇怪的问题,该问题一直持续到昨天。
这是我的.conf文件:
input {
beats {
port => 5044
}
}
filter {
if "access.log" in [source] {
grok {
match => { "message" => "%{GREEDYDATA:messagebefore}\[%{HTTPDATE:real_date}\]\ %{GREEDYDATA:messageafter}" }
}
mutate {
replace => { "[message]" => "%{messagebefore} %{messageafter}" }
remove_field => [ "messagebefore" ]
remove_field => [ "messageafter" ]
}
date {
match => [ "real_date", "dd/MMM/YYYY:HH:mm:ss Z" ]
}
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
}
}
问题在于,在输出中,派生变量%messagebefore和%messageafter作为文字文本而不是内容进行传递。
示例:
source:/var/log/nginx/access.log message:%{messagebefore} %{messageafter}...
奇怪的是,这在昨天下午之前运行良好。我也很欣赏这可能不是处理nginx日志的最佳方法,但是我仅以它为例,因为它也会影响我的所有其他配置文件。
我的环境:
ELK堆栈在Centos 7上作为docker容器运行,源自docker.io/sebp/elk。
在Centos 7客户端上运行的Filebeat。
有什么想法吗?
谢谢。
答案 0 :(得分:0)
我自己解决了这个问题,并在此处发布以防有人遇到相同的问题。
在构建Docker容器时,我无意中遗忘了另一个.conf文件,其中也包含对access.log的引用。这两个.conf文件在logstash处理这两个文件时发生冲突。我删除了错误的文件,它全部开始工作。