使用 ElasticSearch、Redis、Nginx 在 Linux 上设置 Logstash
Logstash 是一个开源的中央日志文件管理应用程序。
您可以从多个服务器、多个应用程序收集日志,解析这些日志,并将其存储在一个中心位置。存储后,您可以使用 Web GUI 搜索日志、深入查看日志并生成各种报告。
本教程将解释 logstash 的基础知识以及您需要了解的有关如何在系统上安装和配置 logstash 的所有信息。
1. 下载 Logstatsh 二进制文件
Logstash 是 elasticsearch 系列的一部分。从 logstash 网站下载。请注意,您应该在您的机器上安装 java 才能正常工作。
或者,使用 curl 直接从网站下载。
wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz
tar zxvf logstash-1.4.2.tar.gz
cd logstash-1.4.2
注意:稍后我们将使用 yum 安装 logstash。现在,我们将首先手动下载二进制文件,以从命令行检查它是如何工作的。
2.Logstash在命令行中指定选项
为了了解logstash的基础知识,为了测试目的,让我们从命令行快速检查一些东西。
从命令行执行logstash,如下所示。当它提示时,只需输入“hello world”作为输入。
# bin/logstash -e 'input { stdin { } } output { stdout {} }'
hello world
2014-07-06T17:27:25.955+0000 base hello world
在上面的输出中,第一行是我们使用标准输入输入的“hello world”。
第二行是logstash 使用标准输出显示的输出。基本上,它只是吐出我们在标准输入中输入的任何内容。
请注意,指定 -e 命令行标志允许 Logstash 直接从命令行接受配置。这对于快速测试配置非常有用,而无需在迭代之间编辑文件。
3.使用编解码器修改输出格式
rubydebug 编解码器将使用 ruby-awesome-print 库输出您的 Logstash 事件数据。
因此,通过重新配置“stdout”输出(添加“编解码器”),我们可以更改 Logstash 的输出。通过在配置中添加输入、输出和过滤器,可以通过多种方式处理日志数据,以便在查询时最大限度地提高存储数据的灵活性。
# bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
hello world
{
"message" => "",
"@version" => "1",
"@timestamp" => "2014-07-06T17:40:48.775Z",
"host" => "base"
}
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2014-07-06T17:40:48.776Z",
"host" => "base"
}
4. 下载 ElasticSearch
现在我们已经了解了 Logstash 的工作原理,让我们再往前走一步。很明显,我们不能手动传递everylog的输入和输出。所以解决这个问题,我们将不得不安装一个名为 Elasticsearch 的软件。
或者,使用 wget,如下所示。
curl -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.0.tar.gz
tar zxvf elasticsearch-1.4.0.tar.gz
启动elasticsearch服务如下图:
cd elasticsearch-1.4.0/
./bin/elasticsearch
注意:本教程指定使用 Elasticsearch 1.4.0 运行 Logstash 1.4.2。每个 Logstash 版本都有一个推荐的 Elasticsearch 版本来配对。确保版本根据您正在运行的 Logstash 版本匹配。
5. 验证 ElasticSearch
默认情况下,elasticsearch 在 9200 端口上运行。
出于测试目的,我们仍然会从标准输入中获取输入(类似于我们之前的示例),但输出不会显示在标准输出上。相反,它将转到弹性搜索。
为了验证elasticsearch,让我们执行以下操作。当它要求输入时,只需在下面输入“the geek stuff”。
# bin/logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }'
由于我们不会在标准输出中看到输出,因此我们应该查看弹性搜索。
转到以下网址:
http://localhost:9200/_search?pretty
以上将显示弹性搜索中可用的所有消息。您应该在输出中看到我们在上述 logstash 命令中输入的消息。
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 9,
"max_score" : 1.0,
"hits" : [ {
"_index" : "logstash-2014.07.06",
"_type" : "logs",
"_id" : "G3uZPQCMQ6ed4joNCuseew",
"_score" : 1.0, "_source" : {"message":"the geek stuff","@version":"1","@timestamp":"2014-07-06T18:09:46.612Z","host":"base"}
} ]
}
6. Logstash 输入、输出和编解码器
输入、输出、编解码器和过滤器是 Logstash 配置的核心。通过创建事件处理管道,Logstash 能够从您的日志中提取相关数据并将其提供给 elasticsearch,从而有效地查询您的数据。
以下是一些可用的输入。输入是将日志数据传递给 Logstash 的机制
- 文件:从文件系统上的文件中读取,很像 UNIX 命令“tail -0a”
- syslog:在众所周知的 514 端口上侦听 syslog 消息并根据 RFC3164 格式进行解析
- redis:从 redis 服务器读取,使用 redis 通道和 redis 列表。Redis 通常用作集中式 Logstash 安装中的“代理”,它将来自远程 Logstash“托运人”的 Logstash 事件排队。
- lumberjack:处理在 lumberjack 协议中发送的事件。现在称为logstash-forwarder。
以下是一些过滤器。过滤器用作 Logstash 链中的中间处理设备。它们通常与条件结合,以便在事件符合特定条件时对事件执行特定操作。
- grok:解析任意文本并对其进行结构化。Grok 目前是 Logstash 中将非结构化日志数据解析为结构化和可查询的最佳方式。Logstash 内置了 120 种模式,您很可能会找到一种满足您需求的模式!
- mutate:mutate 过滤器允许您对字段进行一般突变。您可以重命名、删除、替换和修改事件中的字段。
- drop:完全删除一个事件,例如调试事件。
- 克隆:复制事件,可能添加或删除字段。
- geoip:添加有关 IP 地址地理位置的信息(并在 kibana 中显示惊人的图表)
以下是一些编解码器。输出是 Logstash 管道的最后阶段。一个事件在处理过程中可能会经过多个输出,但是一旦所有输出完成,事件就完成了它的执行。
- elasticsearch:如果您打算以高效、方便且易于查询的格式保存数据
- 文件:将事件数据写入磁盘上的文件。
- 石墨:将事件数据发送到石墨,一种流行的开源工具,用于存储和绘制指标
- statsd:一种“侦听通过 UDP 发送的统计信息,如计数器和计时器,并将聚合发送到一个或多个可插拔后端服务”的服务。
7. 使用 Logstash 配置文件
现在是时候从命令行选项转移到配置文件了。您可以在 .conf 文件中指定它们,而不是在命令行中指定选项,如下所示:
# vi logstash-simple.conf
input { stdin { } }
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
现在让 logstast 读取我们刚刚使用 -f 选项创建的配置文件,如下所示。出于测试目的,这仍然使用标准输入和标准输出。因此,在输入此命令后键入一条消息。
# bin/logstash -f logstash-simple.conf
This is Vadiraj
{
"message" => "This is Vadiraj",
"@version" => "1",
"@timestamp" => "2014-11-07T04:59:20.959Z",
8. 解析输入 Apache 日志消息
现在,让我们做一些更高级的配置。从 logstash-simple.conf 文件中删除所有条目并添加以下行:
# vi logstash-simple.conf
input { stdin { } }
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
现在,执行 logstash 命令,如下所示:
# bin/logstash -f logstash-filter.conf
但是,这一次,将以下示例 apache 日志文件条目粘贴为输入。
# bin/logstash -f logstash-filter.conf
"127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0""
logstatsh 的输出将类似于以下内容:
{
"message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/status.php HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"",
"@version" => "1",
"@timestamp" => "2013-12-11T08:01:45.000Z",
"host" => "base.tgs.com",
"clientip" => "127.0.0.1",
"ident" => "-",
"auth" => "-",
"timestamp" => "11/Dec/2013:00:01:45 -0800",
"verb" => "GET",
"request" => "/xampp/status.php",
"httpversion" => "1.1",
"response" => "200",
"bytes" => "3891",
"referrer" => "\"http://cadenza/xampp/navi.php\"",
"agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\""
}
正如您从上面的输出中看到的,我们的输入被相应地解析,所有的值都被拆分并存储在相应的字段中。
grok 过滤器提取了 apache 日志并分解为有用的位,以便稍后我们可以查询。
9. Apache 错误日志的 Logstash 配置文件
为 apache error_log 文件创建以下 logstash 配置文件。
# vi logstash-apache.conf
input {
file {
path => "/var/log/httpd/error_log"
start_position => beginning
}
}
filter {
if [path] =~ "error" {
mutate { replace => { "type" => "apache_error" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
host => localhost
}
stdout { codec => rubydebug }
}
在上面的配置文件中:
- 输入文件是 /var/log/httpd/error_log 并且起始位置将是文件的开头。
- 过滤输入文件并将任何有错误的内容重命名(变异)为 apache_error。grok 将在消息列中创建一个组合的 apachelog,并且数据将显示具有给定格式的时间戳。
- 输出将存储在 localhost 的 elasticsearch 中,并使用编解码器 => rubydebug 通过 ruby 打印格式的标准输出回显
10. Apache 错误日志和访问日志的 Logstash 配置文件
我们可以使用 *_log 指定通配符来读取所有日志文件,如下所示。
但是,我们还需要相应地更改条件以解析访问和错误日志,如下所示。
# vi logstash-apache.conf
input {
file {
path => "/var/log/httpd/*_log"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { type => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
} else if [path] =~ "error" {
mutate { replace => { type => "apache_error" } }
} else {
mutate { replace => { type => "random_logs" } }
}
}
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
- 点赞
- 收藏
- 关注作者
评论(0)