基于devops利用微服务引入三方服务---logstash采集与filebeat采集比较

1、比较说明

logstash在采集文件类日志的时候需要对日志进行读取、过滤、输出,这三个阶段都需要logstash来实现,而且在过滤阶段会利用grok插件对无规则日志进行正则匹配,这会消耗较大资源,如果利用filebeat读取日志写入到logstash,同时为了在过滤阶段减少资源消耗可以自定义文件类日志格式为json格式,logstash利用其json插件无需正则匹配,然后logstash输出,如此资源消耗会减少很多

比较以下两种情况:

  • logstash采集messages、nginx自定义格式日志
  • filebeat采集messages、nginx自定义格式日志

2、logstash采集日志

定义nginx日志格式
http模块如下配置
cat nginx.conf

...
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';


    log_format json '{"@timestamp":"$time_iso8601",'
                           '"@version":"1",'
                           '"client":"$remote_addr",'
                           '"url":"$uri",'
                           '"status":"$status",'
                           '"method":"$request_method",'
                           '"domain":"$host",'
                           '"host":"$server_addr",'
                           '"size":$body_bytes_sent,'
                           '"responsetime":$request_time,'
                           '"referer": "$http_referer",'
                           '"ua": "$http_user_agent"'
               '}';



    #access_log  /var/log/nginx/access.log  main;
     access_log /var/log/nginx/nginx_access_log  json;
 ...

重载nginx配置

logstash配置输入输出
cat logstash.conf

input {
 
    file {
      path => "/var/log/messages"
      type => "system"
      start_position => "beginning"
    }

    file {
       path => "/var/log/nginx_access_log"
       codec => json
       start_position => "beginning"
       type => "nginx-log"
    }

}

output {
     
    if [type] == "system"{
        elasticsearch {
           hosts => ["elasticsearch:9200"]
           index => "systemlog-%{+YYYY.MM.dd}"
        }
    }
  
    if [type] == "nginx-log"{
        elasticsearch {
           hosts => ["elasticsearch:9200"]
           index => "nginx-log-%{+YYYY.MM.dd}"
        }
    }
}

chmod +x 644 /var/log/massages
重启logstash服务

安装ES可视化插件
为了确定logstash的确将日志数据输入到es中了,需要安装以下插件
cat docker-compose.yml

version: "3"
services:
  elastichd :
    image: containerize/elastichd:latest
    networks:
      - elk_overlay
    volumes:
      - "/etc/localtime:/etc/localtime:ro"
    ports:
      - "9800:9800"
    deploy:
      placement:
        constraints: [node.hostname==node152]
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
networks:
  elk_overlay:

docker stack deploy -c docker-compose.yml 152
访问地址http://192.168.0.152:9800即可查看es情况
08api59

在kibana查看数据
进入kibana后需要线创建index样式
08api60

这里遇到一个错误,按照道理创建完索引样式后就可以点击discover来查看日志事件了,但是这里出现如下信息导致无法查找事件

In order to visualize and explore data in Kibana, you'll need to create an index pattern to retrieve

远程访问kibana的discover查找界面被拒绝

解决方式
配置文件新增一条
server.host: "0.0.0.0"

查看数据
08api61

3、filebeat采集日志

清空旧数据
为了方便测试先清空elasticsearch的数据,重启elk组件,登录es和kibana查看数据是否已清空
在删除elasticsearch挂载的数据目录后重启kibana遇到错误

151_kibana.1.2f202blwfind@node151 | {"type":"log","@timestamp":"2020-08-20T02:42:41Z","tags":["warning","savedobjects-service"],"pid":5,"message":"Unable to connect to Elasticsearch. Error: [search_phase_execution_exception] all shards failed"}

同时查看es可视化工具发现es处于red状态
08api62
查看es服务日志发现有报错,是有部分系统索引数据坏了

解决方式
以下图中为解决问题后呈现的结果

  • 查看索引信息
    08api63
    字段active_shards_percent_as_number为100%才是正常的

  • 查看所有所有的状态
    08api64
    图中索引状态 为green为正常,yellow为非正常状态但暂时可用,red为不可用状态

  • 删除red状态的索引
    curl -XDELETE http://192.168.0.152:9200/索引名

配置logstash
首先logstash不再作为数据源的获取agent了,把其服务中的挂载的日志文件目录注释掉
- /var/log/nginx_access_log:/var/log/nginx_access_log

采集数据的工作交给filebeat,lgostash只需要监听5044端口的发过来的数据即可
cat logstash.conf

input {
  beats {
    port => 5044
    codec => json
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "nginx-log-%{+YYYY.MM.dd}"
  }
  stdout{codec => rubydebug}
}

启动logstash
日志查看启动状态
docker service logs -f --tail 10 152_logstash
出现如下画面表示启动成功
08api65

部署filebeat
创建compose文件
cat docker-compose.yml

version: "3.4"
services:
  filebeat:
    image: prima/filebeat:latest
    networks:
      - elk_overlay
    volumes:
      - $WORK_HOME_FILEBEAT/config/filebeat.yml:/filebeat.yml
      - $WORK_HOME_NGINX/logs/nginx_access_log:/var/log/nginx_access_log
      - $WORK_HOME_FILEBEAT/registry:/data/registry
      - "/etc/localtime:/etc/localtime:ro"
    deploy:
      placement:
        constraints: [node.hostname==node152]
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
networks:
  elk_overlay:
    external: true

创建配置文件
cat filebeat.yml

filebeat.prospectors:
- input_type: log
  enabled: true
  paths:
    - /var/log/nginx_access_log
  json.keys_under_root: true
  json.overwrite_keys: true
  fields:
    filetype: nginx-log
  fields_under_root: true

- input_type: log
  enabled: true
  paths:
    - /var/log/messages
  fields:
    filetype: systemlog
  fields_under_root: true

registry_file: /data/registry

output.logstash:
  enabled: true
  hosts: ["logstash:5044"]

logstash配置
cat logstash.conf

input {
  beats {
    port => 5044
  }
}

output {
  
  if [filetype] == "nginx-log" {
      elasticsearch {
      hosts => ["http://elasticsearch:9200"]
      index => "nginx-log-%{+YYYY.MM.dd}"
      } 
  }
 
  if [filetype] == "systemlog" {
      elasticsearch {
      hosts => ["elasticsearch:9200"]
      index => "systemlog-%{+YYYY.MM.dd}"
      }
  }
  stdout{codec => rubydebug}

}

依次启动es、logstash、elastichd、kibana 、filebeat
查看elastichd查看是否存在索引,同时打开logstash日志,查看lostash的日志输出状态,正常状态输出应该会有以下信息输出
08api67

4、问题

1、elk运行一段时间,elastichd提示集群状态为yellow
答:查看es状态
curl -X GET "192.168.0.152:9200/_cluster/health?pretty"

{
  "cluster_name" : "docker-cluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 6,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 2,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 75.0
}

单机部署的es默认副本分片每个节点上数目为1,图中有两个指向不明的分片,删除掉即可,但最好的方式是再添加一个es节点
删除指向不明的分片
curl -X PUT "192.168.0.152:9200/_settings" -H 'Content-Type: application/json' -d'{"number_of_replicas":0}'

2、关于filebeat有时候会出现错误

Exiting: Could not start registrar: Error loading state: Error decoding states: EOF

答:删除日志位置文件registry重启服务

5、小结

优势
1、filebeat可以直接向es写数据,但是filebeat是过滤插件没有logstash丰富,所以一般来说只是用来采集数据往logstash里写
2、filebeat比较轻量级,其镜像才100多兆,运行起来占用资源相对少很多
3、filebeat本身是es公司开发的,后期更新有保障

缺点
目前只能写数据到redis,无法读数据出来