我有一个到目前为止正在运行的ELK安装程序,我想使用它来分析来自不同来源的日志文件:
我正在使用filebeat从日志文件中收集内容,并使用此filebeat.yml将其发送到logstash:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/nginx/example_com/logs/
output.logstash:
hosts: ["localhost:5044"]
在logstash中,我已经配置了grok-section,但是仅用于nginx-logs。这是我发现的唯一工作教程。因此,此配置从 filebeat 接收内容,使用过滤器(这是grok的目的吗?)并将其发送到 elasticsearch 。
input {
beats {
port => 5044
}
}
filter {
grok {
patterns_dir => "/etc/logstash/patterns"
match => { "message" => "%{NGINXACCESS}" }
}
}
output {
elasticsearch {
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
这就是我正在引用的一个nginx模式文件的内容:
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} (?:-|(%{WORD}.%{WORD})) %{USER:ident} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{QS:forwarder}
但是我很难理解如何管理不同的日志数据源。因为现在Kibana仅显示/ var / log中的日志内容,但是我的特定nginx文件夹中没有日志数据。
什么是我在这里做错了?
答案 0 :(得分:0)
由于您正在运行filebeat,因此您已经有一个可用的模块,该模块可以处理nginx日志filebeat nginx module
这样,您将不需要logstash来处理日志,而只需将输出直接指向elasticsearch。
但是,由于您要处理具有不同日志的多个路径,并且由于弹性堆栈不允许具有多种输出形式(logstash + elasticserach),因此可以将logstash设置为仅处理非nginx来的日志。这样,并使用模块(示例仪表板随附),您的日志即可: Filebeat-> Logstash(从输入插件到输出插件-无需任何过滤)-> Elasticsearch
如果您真的想自己处理日志,则可以轻松完成。但是现在,您的所有日志都正在通过grok模式进行处理。因此,可能是您的模式存在问题,该模式处理来自nginx的日志,而不是以相同的方式处理来自nginx的日志。您可以使用以下内容在过滤器插件中过滤日志:
#if you are using the module
filter {
if [fileset][module] == "nginx" {
}
}
如果没有,请访问logstash docs
查看其他可用示例您可以尝试的另一件事,就是将其添加到过滤器中。这样,如果grok失败,您将在kibana中看到该日志,但是带有“ _grok_parse_error_nginx_error”失败标签。
grok {
patterns_dir => "/etc/logstash/patterns"
match => { "message" => "%{NGINXACCESS}" }
tag_on_failure => [ "_grok_parse_error_nginx_error" ]
}