介绍
Logstash 是一个强大的工具,用于集中和分析日志,可以帮助提供环境概览,并识别服务器的问题。增加 ELK Stack(Elasticsearch、Logstash 和 Kibana)设置的有效性之一是通过收集重要的应用程序日志,并通过使用过滤器对日志数据进行结构化,以便数据可以被轻松分析和查询。我们将围绕“grok”模式构建我们的过滤器,以将日志中的数据解析为有用的信息片段。
先决条件
要遵循本教程,您必须拥有一个正在接收来自 Filebeat 等发货人的日志的 Logstash 服务器。
ELK 服务器假设
- Logstash 安装在
/opt/logstash
- 您的 Logstash 配置文件位于
/etc/logstash/conf.d
- 您有一个名为
02-beats-input.conf
的输入文件 - 您有一个名为
30-elasticsearch-output.conf
的输出文件
您可能需要在 Logstash 服务器上运行以下命令来创建 patterns
目录:
sudo mkdir -p /opt/logstash/patterns sudo chown logstash: /opt/logstash/patterns
客户端服务器假设
- 您已经在每个应用程序服务器上配置了 Filebeat,将 syslog/auth.log 发送到您的 Logstash 服务器(如先决条件教程中的“设置 Filebeat”部分)
如果您的设置不同,请简单地调整本指南以匹配您的环境。
关于 Grok
Grok 通过使用正则表达式解析文本模式,并将其分配给标识符来工作。
Grok 模式的语法是 %{PATTERN:IDENTIFIER}
。Logstash 过滤器包括一系列 grok 模式,这些模式匹配并将日志消息的各个部分分配给各个标识符,这就是日志的结构化方式。
要了解更多关于 grok 的信息,请访问 Logstash grok 页面和 Logstash 默认模式列表。
如何使用本指南
本文后续的每个主要部分都将包括必要的附加配置细节,以便为给定应用程序收集和过滤日志。对于要记录和过滤的每个应用程序,您都需要在客户端服务器(Filebeat)和 Logstash 服务器上进行一些配置更改。
Logstash 模式子部分
如果有 Logstash 模式子部分,它将包含可以添加到 Logstash 服务器上 /opt/logstash/patterns
中的新文件中的 grok 模式。这将允许您在 Logstash 过滤器中使用新模式。
Logstash 过滤器子部分
Logstash 过滤器子部分将包括一个过滤器,可以添加到 Logstash 服务器上 /etc/logstash/conf.d
中的新文件中,位于输入和输出配置文件之间。该过滤器确定 Logstash 服务器如何解析相关的日志文件。记得在添加新过滤器后重新启动 Logstash 服务,以加载您的更改。
Filebeat Prospector 子部分
Filebeat Prospector 用于指定要发送到 Logstash 的日志。应在 /etc/filebeat/filebeat.yml
文件中的 prospectors
部分的现有 prospector 之后直接添加额外的 prospector 配置:
filebeat: # List of prospectors to fetch data. prospectors: - - /var/log/secure - /var/log/messages document_type: syslog - paths: - /var/log/app/*.log document_type: app-access ...
在上面的示例中,红色突出显示的行表示一个 Prospector,它将 /var/log/app/
中的所有 .log
文件以 app-access
类型发送到 Logstash。在进行任何更改后,必须重新加载 Filebeat 以使任何更改生效。
现在您知道如何使用本指南,接下来的部分将向您展示如何收集和过滤应用程序日志!
应用程序:Nginx
Logstash 模式:Nginx
Nginx 日志模式未包含在 Logstash 的默认模式中,因此我们将手动添加 Nginx 模式。
在您的 ELK 服务器 上,创建一个名为 nginx
的新模式文件:
sudo vi /opt/logstash/patterns/nginx
然后插入以下行:
NGUSERNAME [a-zA-Z\.\@\-\+_%]+ NGUSER %{NGUSERNAME} NGINXACCESS %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}
保存并退出。NGINXACCESS
模式解析并将数据分配给各种标识符(例如 clientip
、ident
、auth
等)。
接下来,更改模式文件的所有权为 logstash
:
sudo chown logstash: /opt/logstash/patterns/nginx
Logstash 过滤器:Nginx
在您的 ELK 服务器 上,创建一个名为 11-nginx-filter.conf
的新过滤器配置文件:
sudo vi /etc/logstash/conf.d/11-nginx-filter.conf
然后添加以下过滤器:
filter { if [type] == "nginx-access" { grok { match => { "message" => "%{NGINXACCESS}" } } } }
保存并退出。请注意,此过滤器将尝试使用上面定义的 NGINXACCESS
模式匹配 nginx-access
类型的消息。
现在重新启动 Logstash 以重新加载配置:
sudo service logstash restart
Filebeat Prospector:Nginx
在您的 Nginx 服务器 上,打开 filebeat.yml
配置文件进行编辑:
sudo vi /etc/filebeat/filebeat.yml
在 filebeat
部分添加以下 Prospector,将 Nginx 访问日志作为 nginx-access
类型发送到您的 Logstash 服务器:
- paths: - /var/log/nginx/access.log document_type: nginx-access
保存并退出。重新加载 Filebeat 以使更改生效:
sudo service filebeat restart
现在您的 Nginx 日志将被收集和过滤!
应用程序:Apache HTTP Web 服务器
Apache 的日志模式已包含在默认的 Logstash 模式中,因此设置其过滤器相当容易。
Logstash 过滤器:Apache
在您的 ELK 服务器 上,创建一个名为 12-apache.conf
的新过滤器配置文件:
sudo vi /etc/logstash/conf.d/12-apache.conf
然后添加以下过滤器:
filter { if [type] == "apache-access" { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } }
保存并退出。请注意,此过滤器将尝试使用默认的 Logstash 模式之一 COMBINEDAPACHELOG
匹配 apache-access
类型的消息。
现在重新启动 Logstash 以重新加载配置:
sudo service logstash restart
Filebeat Prospector:Apache
在您的 Apache 服务器 上,打开 filebeat.yml
配置文件进行编辑:
sudo vi /etc/filebeat/filebeat.yml
在 filebeat
部分添加以下 Prospector,将 Apache 日志作为 apache-access
类型发送到您的 Logstash 服务器:
- paths: - /var/log/apache2/access.log document_type: apache-access
保存并退出。重新加载 Filebeat 以使更改生效:
sudo service filebeat restart
现在您的 Apache 日志将被收集和过滤!
结论
几乎可以收集和解析任何类型的日志。尝试编写自己的过滤器和模式来处理其他日志文件。
欢迎在评论中提出您希望看到的过滤器,或者提供您自己的模式!
如果您不熟悉如何使用 Kibana,请查看本教程:如何使用 Kibana 可视化和仪表板。