通过 Logstash 将 Apache 日志转发到 OpenSearch

简介

有效的Web服务器日志管理对于维护您的网站性能、解决故障问题和深入了解用户行为至关重要。Apache是最受欢迎的Web服务器之一。它生成的访问和错误日志包含宝贵信息。为了高效地管理和分析这些日志,您可以使用Logstash处理并将其转发到DigitalOcean的Managed OpenSearch进行索引和可视化。

在本教程中,我们将指导您在Droplet上安装Logstash,配置它以收集您的Apache日志,并将其发送到Managed OpenSearch进行分析。

先决条件

  1. 安装了Apache Web服务器的Droplet/s。
  2. 托管OpenSearch集群

步骤1 – 安装Logstash

Logstash可以通过二进制文件安装,也可以通过软件包仓库安装。为了更方便的管理和更新,通常推荐使用软件包仓库。

在本节中,我们将指导您使用APT和YUM包管理器在Droplet上安装Logstash。

让我们来识别操作系统:

cat /etc/os-release

对于基于APT的系统(Ubuntu/Debian)

下载并安装公共签名密钥:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

在继续之前,您可能需要在Debian上安装apt-transport-https包:

sudo apt-get install apt-transport-https

将仓库定义保存到/etc/apt/sources.list.d/elastic-8.x.list

echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list

使用上述echo方法添加Logstash仓库。不要使用add-apt-repository,因为它会添加一个deb-src条目,但我们不提供源包。如果您已经添加了deb-src条目,您会看到如下错误:

Unable to find expected entry 'main/source/Sources' in Release file (Wrong sources.list entry or malformed file)

只需从/etc/apt/sources.list文件中删除deb-src条目,安装应如预期工作。

运行sudo apt-get update,仓库即可使用。您可以用以下命令安装:

sudo apt-get update && sudo apt-get install logstash

针对基于YUM的系统(CentOS/RHEL)

下载并安装公钥:

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

在你的/etc/yum.repos.d/logstash.repo文件中添加以下内容。你可以使用‘tee’命令来更新和创建该文件。

sudo tee /etc/yum.repos.d/logstash.repo > /dev/null <<EOF
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

你的仓库现在可以使用了。你可以使用以下命令安装它:

sudo yum install logstash

有关更多信息,请参考安装Logstash指南。

第2步 – 配置Logstash将日志发送到OpenSearch

Logstash管道由三个主要阶段组成:输入、过滤和输出。Logstash管道使用插件。你可以使用社区插件或创建自己的插件。

  • 输入:这个阶段从各种来源收集数据。Logstash支持许多输入插件来处理数据源,如日志文件、数据库、消息队列和云服务。

  • 过滤:此阶段处理输入阶段收集的数据。过滤器可以修改、丰富和结构化数据,使其更有用且更容易分析。

  • 输出:此阶段将处理后的数据发送到目的地。目的地可以包括数据库、文件和像OpenSearch这样的数据存储。

步骤3 – 安装Open Search输出插件

可以通过运行以下命令来安装OpenSearch输出插件:

/usr/share/logstash/bin/logstash-plugin install logstash-output-opensearch

有关更多信息,请查看此logstash-output-opensearch-plugin代码仓库。

现在让我们创建一个管道

在路径 /etc/logstash/conf.d/ 中创建一个名为 apache_pipeline.conf 的新文件,并复制以下内容。

input {
  file {
    path => "/var/log/apache2/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    tags => "apache_access"
  }

  file {
    path => "/var/log/apache2/error.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    tags => "apache_error"
  }
}

filter {
  if "apache_access" in [tags] {
    grok {
        match => { "message" => "%{HTTPD_COMBINEDLOG}" }
    }
    mutate {
        remove_field => [ "message","[log][file][path]","[event][original]" ]
      }
   } else {
   grok {
        match => { "message" => "%{HTTPD24_ERRORLOG}" }
    }
   }
}

output {
  if "apache_access" in [tags] {
  opensearch {
    hosts       => "https://<OpenSearch-Hostname>:25060"
    user        => "doadmin"
    password    => "<your_password>"
    index       => "apache_access"
    ssl_certificate_verification => true
  }

  } else {
  opensearch {
    hosts       => "https://<OpenSearch-Hostname>:25060"
    user        => "doadmin"
    password    => "<your_password>"
    index       => "apache_error"
    ssl_certificate_verification => true
  }
  }
}

<OpenSearch_Host> 替换为您的OpenSearch服务器的主机名,将 <OpenSearch_Password> 替换为您的OpenSearch密码。

让我们来分解上述配置。

  • 输入:用于配置事件源。这里使用了“文件”输入插件。

  • path => “/var/log/apache2/access.log” :指定了Logstash将从哪个路径读取Apache访问日志文件。

    请确保Logstash服务能够访问输入路径。

  • start_position => “beginning”:定义了Logstash应该从哪里开始读取日志文件。 “beginning”表示Logstash应从文件的开头开始处理,而不是从末尾开始。

  • sincedb_path => “/dev/null”: 指定一个sincedb文件的路径。Sincedb文件被Logstash用来跟踪日志文件中的当前位置,使其能够在重启或失败的情况下从停止的地方继续。

  • tags => “apache_access”: 为从这个输入读取的事件分配一个标签。标签在Logstash中用于识别和过滤事件,通常在配置的输出或过滤阶段下游使用。我们用于后者的标签

  • FILTER: 用于处理事件。

    开始条件判断:

    (if "apache_access" in [tags]):
    

    这检查是否有标签 apache_access 存在于传入日志事件的 [tags] 字段中。我们使用这个条件来应用适当的 GROK 过滤器以处理 Apache 访问和错误日志。

  • Grok 过滤器(用于 Apache 访问日志):

    grok {
        match => { "message" => "%{HTTPD_COMBINEDLOG}" }
    }
    

    Grok 过滤器 %{HTTPD_COMBINEDLOG} 是 Logstash 中用于解析 Apache 组合访问日志格式的预定义模式。它从传入事件的消息字段中提取 IP 地址、时间戳、HTTP 方法、URI、状态码等信息。

  • 自定义分隔符

    Mutate Filter Remove (optional): 在Apache日志被解析后,我们使用mutate-remove来删除某些字段。

    自定义分隔符

    自定义分隔符

    mutate {
        remove_field => [
            "message",
            "[log][file][path]",
            "[event][original]"
        ]
    }
    

    自定义分隔符

  • 其他条件:如果[tags]中没有apache_access标签,则执行else块。这个else块包含另一个用于解析Apache错误日志的GROK过滤器。

    grok {
        match => { "message" => "%{HTTPD24_ERRORLOG}" }
    }
    

    这个GROK过滤器%{HTTPD24_ERRORLOG}用于解析符合Apache错误日志格式的消息。它提取与错误日志相关的字段,如时间戳、日志级别、错误消息等。

    GROK模式可以在以下位置找到:https://github.com/logstash-plugins/logstash-patterns-core/tree/main/patterns

  • 输出:输出插件将事件发送到特定目的地。

    输出块从if条件开始。我们在这里使用if条件。

    if "apache_access" in [tags] {}
    

    这个if条件用于将日志路由到OpenSearch的两个单独索引apache_errorapache_access

    让我们探索OpenSearch输出插件:

    hosts            => "https://XXX:25060"  您的Open search 主机名
    user             => "doadmin"            您的Open search 用户名
    password         => "XXXXX"              OpenSearch 密码
    index            => "apache_error"       OpenSearch中的索引名称
    ssl_certificate_verification => true    启用SSL证书验证
    

步骤4 – 启动Logstash

配置好Pipeline后,启动Logstash服务:

systemctl enable logstash.service
systemctl start logstash.service
systemctl status logstash.service

步骤5 – 故障排除

检查连通性

您可以通过测试连通性来验证Logstash是否能够连接到OpenSearch:

curl -u your_username:your_password -X GET "https://your-opensearch-server:25060/_cat/indices?v"

your-opensearch-server替换为您的OpenSearch服务器的主机名,将your_usernameyour_password替换为您的OpenSearch凭据。

数据摄取

确保数据已经被正确地索引到OpenSearch中:

curl -u your_username:your_password -X GET "http://your-opensearch-server:25060/<your-index-name>/_search?pretty"

your-opensearch-server替换为您的OpenSearch服务器的主机名,将your_usernameyour_password替换为您的OpenSearch凭据。同样,将your-index-name替换为索引名称。

防火墙和网络配置

确保防火墙规则和网络设置允许Logstash和OpenSearch在端口25060上进行通信。

日志

Logstash的日志可以在/var/log/logstash/logstash-plain.log找到。

具体请参考故障排除

结论

在本指南中,我们介绍了如何设置Logstash以收集并转发Apache日志到OpenSearch。以下是本指南涵盖的内容摘要:

安装Logstash:我们介绍了如何根据您的Linux发行版,使用APT或YUM包管理器来在您的Droplet上安装Logstash。

配置Logstash:我们创建并调整了Logstash配置文件,以确保Apache日志被正确解析并发送到OpenSearch。

在OpenSearch中验证:我们在OpenSearch Dashboards中设置了一个索引模式,以确认您的日志是否被正确索引并可供分析。

完成这些步骤后,您应该现在拥有一个功能完整的设置,其中Logstash收集Apache日志并发送到OpenSearch。

Source:
https://www.digitalocean.com/community/tutorials/forward-apache-logs-to-opensearch-via-logstash