使用 ElasticSearch、Redis、Nginx 在 Linux 上设置 Logstash

举报
Tiamo_T 发表于 2022/09/15 23:50:31 2022/09/15
【摘要】 Logstash 是一个开源的中央日志文件管理应用程序。 您可以从多个服务器、多个应用程序收集日志,解析这些日志,并将其存储在一个中心位置。存储后,您可以使用 Web GUI 搜索日志、深入查看日志并生成各种报告。

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 中,并使用编解码器 => ruby​​debug 通过 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 } 
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。