折腾了一套 ELK Stack 日志平台(四)

·  阅读 78

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

你好,我是悟空呀~

前言

最近在折腾 ELK 日志平台,它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。

专门实操了一波,这玩意看起来简单,但是里面的流程步骤还是很多的,而且遇到了很多坑。在此记录和总结下。

部署 Filebeat 日志收集工具

安装 Filebeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.7.1-linux-x86_64.tar.gz
复制代码

请注意:由于 ELK 迭代比较快,我们可以把上面的版本 7.7.1 替换成我们需要的版本即可。我们先不要运行 Filebeat。

配置 Filebeat

我们在 Filebeat 的安装目录下,可以创建一个这样的 filebeat_apache.yml 文件,它的内容如下,首先先让 filebeat 直接将日志文件导入到 elasticsearch,来确认 filebeat 是否正常工作

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/vagrant/logs/*.log

output.elasticsearch:
  hosts: ["192.168.56.10:9200"]
复制代码

paths 对应你的日志文件夹路径,我配置的是这个:/home/vagrant/logs/*.log,之前配置成 /home/vagrant/logs 不能正常收集。另外这里可以放入多个日志路径。

测试 Filebeat

在使用时,你先要启动 Logstash,然后再启动 Filebeat。

bin/logstash -f weblog.conf
复制代码

然后,再运行 Filebeat, -c 表示运行指定的配置文件,这里是 filebeat_apache.yml。

./filebeat -e -c filebeat_apache.yml
复制代码

运行结果如下所示,一定要确认下控制台中是否打印了加载和监控了我们指定的日志。如下图所示,有三个日志文件被监控到了:error.log、info.log、debug.log

我们可以通过这个命令查看 filebeat 的日志是否导入成功了:

curl http://localhost:9200/_cat/indices?v
复制代码

这个命令会查询 Elasticsearch 中所有的索引,如下图所示,filebeat-7.7.1-* 索引创建成功了。因为我没有配置索引的名字,所以这个索引的名字是默认的,。

在 kibana 中搜索日志,可以看到导入的 error 的日志了。不过我们先得在 kibana 中创建 filebeat 的索引(点击 create index pattern 按钮,然后输入 filebeat 关键字,添加这个索引),然后才能在 kibana 的 Discover 控制台查询日志。

创建查询的索引

搜索日志

Filebeat + Logstash

接下来我们配置 filebeat 收集日志后,输出到 logstash,然后由 logstash 转换数据后输出到 elasticsearch。

filebeat.inputs:

- type: log
  enabled: true
  paths:
    - /home/vagrant/logs/*.log

output.logstash:
  hosts: ["localhost:9900"]
复制代码

修改 logstash 配置文件

vim /logstash-7.7.1/streamconf/weblog.conf
复制代码

配置了 input 为 beats,修改了 useragent

input {  
  beats {
    port => "9900"
  }
}
 
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
 
  mutate {
    convert => {
      "bytes" => "integer"
    }
  }
 
  geoip {
    source => "clientip"
  }
 
  useragent {
    source => "user_agent"
    target => "useragent"
  }
 
  date {
    match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
  }
}
 
output {
  stdout {
    codec => dots {}
  }
 
  elasticsearch {
    hosts=>["192.168.56.10:9200"]
    index => "apache_elastic_example"
  }
}
复制代码

然后重新启动 logstash 和 filebeat。有个问题,这次启动 filebeat 的时候,只监测到了一个 info.log 文件,而 error.log 和 debug.log 没有监测到,导致只有 info.log 导入到了 Elasticsearch 中。

filebeat 只监测到了 info.log 文件

logstash 输出结果如下,会有格式化后的日志:

我们在 Kibana dev tools 中可以看到索引 apache_elastic_example,说明索引创建成功,日志也导入到了 elasticsearch 中。

另外注意下 logstash 中的 grok 过滤器,指定的 message 的格式需要和自己的日志的格式相匹配,这样才能将我们的日志内容正确映射到 message 字段上。

例如我的 logback 的配置信息如下:

logback 配置

而我的 logstash 配置如下,和 logback 的 pettern 是一致的。

grok {
    match => { "message" => "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n" }
  }
​
复制代码

然后我们在 es 中就能看到日志文件中的信息了。如下图所示:

至此,Elasticsearch + Logstash + Kibana + Filebeat 部署成功,可以愉快的查询日志了~

后续升级方案:

  • 加上 Kafka
  • 加上 Grafana 监控

遇到的问题和解决方案

拉取 kibana 镜像失败

failed to register layer: Error processing tar file(exit status 2): fatal error: runtime: out of memory

原因是 inodes 资源耗尽 , 清理一下即可

df -i
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
复制代码
curl -s https://raw.githubusercontent.com/ZZROTDesign/docker-clean/v2.0.4/docker-clean |
sudo tee /usr/local/bin/docker-clean > /dev/null && \
sudo chmod +x /usr/local/bin/docker-clean
docker-clean
复制代码

拉取 kibana 镜像失败

docker pull runtime: out of memory

增加虚拟机内存大小

Kibana 无法启动

"License information could not be obtained from Elasticsearch due to Error: No Living connections error"}

看下配置的 IP 地址是不是容器的 IP。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改