elk+filebeat+grafana日志收集平台学习笔记(上)

简介: elk+filebeat+grafana日志收集平台学习笔记

环境配置:


使用自己的两台1v2g阿里云主机以及好友颖枞的一台1v2gvps,共计三台主机


环境架构如下:


640.jpg


三台主机的环境分别如下:


node1:elasticsearch6.4+filebeat

node2:kibana6.4+grafana+filebeat

node3:logstash+nginx+filebeat+Redis


由于es很消耗内存,所以我只把es单独运行在一个主机上,并设置主分片为1,副本分片为0,每周定时删除上周的索引数据


日志采集端配置


安装Redis


redis服务器是logstash官方推荐的broker(代理人)选择,broker角色也就意味着会同时存在输入和输出两个插件,产生数据的被称作生产者,而消费数据的被称作消费者。


redis消息队列作用说明:


1、防止Logstash和ES无法正常通信,从而丢失日志。
2、防止日志量过大导致ES无法承受大量写操作从而丢失日志。
3、应用程序(php,java)在输出日志时,可以直接输出到消息队列,从而完成日志收集。


补充:如果redis使用的消息队列出现扩展瓶颈,可以使用更加强大的kafka,flume来代替。


编译安装Redis


wget http://download.redis.io/releases/redis-4.0.11.tar.gz  #下载Redis源码
tar -zxf redis-4.0.11.tar.gz      #解压Redis源码
cp -r redis-4.0.11 /usr/local/    
mv redis-4.0.11/ redis
cd /usr/local/redis/
cp redis.conf bin/
make PREFIX=/usr/local/redis install     #编译安装Redis
echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile   将Redis加入环境变量


启动Redis


1.前端模式启动


直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法


redis-server


2.后端模式启动


修改redis.conf配置文件, daemonize yes 以后端模式启动


vim /usr/local/redis/bin/redis.conf
daemonize yes


执行如下命令启动redis:


redis-server redis.conf


连接redis

redis-cli

关闭Redis


强行终止redis进程可能会导致redis持久化数据丢失。正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,命令为:


redis-cli shutdown


修改nginx日志格式


nginx日志默认格式为log格式,传输到es中需要经过grok插件进行处理并转换成json格式,这一过程是很消耗logstash资源的,而且传入到es中的字段并不容易分析,所以在收集端先将日志转为json格式,再传入es中去,这样传入的字段也是利于分析的。


编辑nginx配置文件


vim /usr/local/nginx/conf/nginx.conf   #修改主配置文件,定义日志格式
log_format json '{ "@timestamp": "$time_iso8601", '
                         '"time": "$time_iso8601", '
                         '"clientip": "$remote_addr", '
                         '"remote_user": "$remote_user", '
                         '"body_bytes_sent": "$body_bytes_sent", '
                         '"request_time": "$request_time", '
                         '"status": "$status", '
                         '"host": "$host", '
                         '"request": "$request", '
                         '"request_method": "$request_method", '
                         '"uri": "$uri", '
                         '"http_referrer": "$http_referer", '
                         '"body_bytes_sent":"$body_bytes_sent", '
                         '"http_x_forwarded_for": "$http_x_forwarded_for", '
                         '"http_user_agent": "$http_user_agent" '
                    '}';
   vim /usr/local/nginx/conf.d/default.conf #修改站点配置文件
   access_log /var/log/nginx/io.log json ;
   vim /usr/local/nginx/conf.d/doc.conf
   access_log  /var/log/nginx/doc.access.log json;


重载nginx


systemctl reload nginx


查看日志格式


tail -f /var/log/nginx/io.log


640.jpg


安装并配置filebeat


filebeat是一个轻量级的日志采集器,由于logstash比较消耗资源,不适合在每台主机上部署logstash


使用RPM安装filebeat


curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.0.1-x86_64.rpm
rpm -vi filebeat-7.0.1-x86_64.rpm


配置filebeat收集nginx日志


配置输入端采集nginx日志,根据字段类型不同输出到Redis不同的key中,每种日志存放在不同的key中,便于后续的处理


vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
    - /var/log/nginx/io.log
  fields:
    type: www_access
  fields_under_root: true
- type: log
  paths:
    - /var/log/nginx/io.error.log
  fields:
    type: www_error
  fields_under_root: true
- type: log
  paths:
    - /var/log/nginx/doc.access.log
  fields: 
    type: doc_access 
  fields_under_root: true
setup.template.settings:
  index.number_of_shards: 1
output.redis: 
   hosts: ["127.0.0.1:6379"]
   key: "nginx"
   keys: 
     - key: "%{[type]}"
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~


重启filebeat


systemctl restart filebeat


进入Redis中查看日志信息


redis-cli


获取key的长度,key长度增加说明日志已经写入到Redis里了,而且也能看到日志的信息,下图日志信息还是log格式的,因为json格式是后来修改的


640.jpg


日志处理端配置


安装并配置logstash


1.安装logstash需要依赖Java8的环境,不支持Java9


使用yum install java命令安装


2.下载并安装公共签名密钥


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


3.添加logstash的yum仓库


vim /etc/yum.repos.d/logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md


4.使用yum安装logstash


yum install logstash


编写日志处理配置文件


定义Redis列表或者频道名称,以及Redis的数据类型,定义type以区分不同的日志类型,使用json插件将message字段处理成json格式,并删掉message字段,使用date插件定义新的时间戳,使用geoip插件根据客户端IP来定位客户端大体,默认是使用GeoLite2 city数据库,此数据库官网每两周更新一次,如果对IP地址的准确性要求高,可写一个定时任务,每两周从官网下载新的数据库,mutate插件用于修改字段数据类型,因为”coordinates”子字段不修改会默认为keyword格式,这对于在kibana上创建坐标地图可能会不支持,关于以上插件的详细信息可查看本人以前发的logstash文章。


vim /etc/logstash/conf.d/test.conf
input {
    redis {
        host => "127.0.0.1"
        port => 6379
        type => "www_access"
        data_type => "list"
        key => "www_access"
        codec => "json"
    }  
    redis {
        host => "127.0.0.1"
        port => 6379
        type => "nginx_error"
        data_type => "list"
        key => "www_error"
    }
    redis {
        host => "127.0.0.1"
                port => 6379
                type => "doc_access"
                data_type => "list"
                key => "doc_access" 
                codec => "json"
    }
}
filter {
    if [type] == "www_access" {                                   
            json {
               source => "message"
               remove_field => "message"
             }
            date {
              match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]         
        }
        geoip {
          source => "clientip"
          fields => ["city_name", "country_code2", "country_name", "region_name","longitude","latitude","ip"]
              add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]                    
              add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]  
        }
        mutate {
              convert => [ "[geoip][coordinates]","float" ]    
        }    
    }
        else if [type] =~ "error" {                          
            grok {
            }
            date {
              match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
            }
        }
        else {
            json {
               source => "message"
                   remove_field => "message"
            }
            date {              
              match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]              }
            geoip {
                  source => "clientip"
                  fields => ["city_name", "country_code2", "country_name", "region_name","longitude","latitude","ip"]                
               add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]                    
                  add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]                }
            mutate {
            convert => ["[geoip][coordinates]","float"]
           }    
        }
}
output {
        if [type] == "www_access" {
      elasticsearch {
        hosts => ["60.205.177.168:9200"]
        index => "nginx_access-%{+YYYY.MM.dd}"
      }
      stdout {
                codec => rubydebug
          }
    }    
    else if [type] == "www_error" {
      elasticsearch {
        hosts => ["60.205.177.168:9200"]
        index => "nginx_error-%{+YYYY.MM.dd}"
      }
    }
    else {
      elasticsearch {
        hosts => ["60.205.177.168:9200"]
                index => "nginx_doc-%{+YYYY.MM.dd}"
      }
      stdout { 
        codec => rubydebug
          }
    }
}


启动logstash


logstash -f /etc/logstash/conf.d/test.conf


再次进入Redis数据库查看,发现日志数据已经被消费掉了


640.png


640.jpg


日志存储分析端配置


安装elasticsearch


elasticsearch同样需要Java运行环境


1.下载elasticsearch的tar包


wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz


2.解压包


tar -xzf elasticsearch-6.4.0.tar.gz


3.修改配置文件


[root@elastic elasticsearch-6.4.0]# vim config/elasticsearch.yml
修改内容如下:
cluster.name: my-elk     #设置集群的名字
node.name: es1            #集群中的节点名称,同一集群中的节点名称不能重复
path.data: /elasticsearch/elasticsearch-6.4.0/data    #设置es集群的数据位置
path.logs: /elasticsearch/elasticsearch-6.4.0/logs/    #设置存放日志的路径
network.host: 192.168.179.134       #绑定本地ip地址
http.port: 9200       #设置开放的端口,默认就是9200端口


4.启动elasticsearch


cd elasticsearch-6.4.0/
./bin/elasticsearch


如果要将es后台运行,可以在命令后加-d


这里要使用普通用户运行,还要把目录授予普通文件权限


chown -R elker.elker /elasticsearch


5.查看启动状态


输入netstat -ntlp |grep 9200查看9200端口是否监听,可以使用curl 192.168.179.134:9200或者在浏览器上输入192.168.179.134:9200进行查看启动后的状态


640.jpg


6.启动过程出现的报错


[WARN ][o.e.b.BootstrapChecks    ] [PWm-Blt] max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]


解决办法:


vim /etc/security/limits.conf 
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096


[WARN ][o.e.b.BootstrapChecks    ] [PWm-Blt] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]


解决办法:


vim /etc/sysctl.conf
vm.max_map_count=655360


修改完成执行命令:


sysctl -p


日志可视化端配置


kibana安装


kibana版本须与es版本一致


1.下载并解压kibana包


wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-linux-x86_64.tar.gz
tar -xzf kibana-6.4.0-linux-x86_64.tar.gz


2.修改kibana默认配置


vim kibana-6.4.0-linux-x86_64/config/kibana.yml
server.port: 5601                             #kibana默认端口是5601
server.host: "192.168.179.134"       #设置绑定的kibana服务的地址
elasticsearch.url: "http://192.168.179.134:9200"    #设置elasticsearch服务器的ip地址,不修改的话启动的时候会报[elasticsearch] Unable to revive connection: http://localhost:9200/连接不上elasticsearch的错误


3.启动kibana


/kibana-6.4.0-linux-x86_64/bin/kibana
netstat -ntlp |grep 5601   #可以查看5601端口是否启动


在浏览器输入192.168.179.134:5601即可访问kibana


4.出现的警告信息


虽然出现警告信息,不过还是可以启动kibana的,本人有点强迫症,不想看到警告信息


警告信息1:[security] Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in kibana.yml


解决方法:修改配置文件vim config/kibana.yml


在配置文件底部添加


xpack.reporting.encryptionKey: “a_random_string”


警告信息2:[security] Session cookies will be transmitted over insecure connections. This is not recommended.


解决方法:修改配置文件vim config/kibana.yml


在配置文件底部添加


xpack.security.encryptionKey: “something_at_least_32_characters”


5.检查kibana状态


在浏览器输入192.168.179.134:5601/status查看kibana状态,或者输入http://192.168.179.134:5601/api/status查看json格式的详细状态


grafana安装


1.下载RPM包并安装


wget https://dl.grafana.com/oss/release/grafana-5.4.2-1.x86_64.rpm
yum install grafana-5.4.2-1.x86_64.rpm
yum install initscripts -y


2.启动grafana


通过init.d方式启动


service grafana-server start
/sbin/chkconfig --add grafana-server


通过systemd启动


systemctl daemon-reload
systemctl start grafana-server
systemctl enable grafana-server.service
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
7月前
|
消息中间件 Java Kafka
搭建ELK日志收集,保姆级教程
本文介绍了分布式日志采集的背景及ELK与Kafka的整合应用。传统多服务器环境下,日志查询效率低下,因此需要集中化日志管理。ELK(Elasticsearch、Logstash、Kibana)应运而生,但单独使用ELK在性能上存在瓶颈,故结合Kafka实现高效的日志采集与处理。文章还详细讲解了基于Docker Compose构建ELK+Kafka环境的方法、验证步骤,以及如何在Spring Boot项目中整合ELK+Kafka,并通过Logback配置实现日志的采集与展示。
1192 64
搭建ELK日志收集,保姆级教程
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
899 90
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
5137 70
Grafana Loki,轻量级日志系统
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
1090 6
|
存储 消息中间件 网络协议
日志平台-ELK实操系列(一)
日志平台-ELK实操系列(一)
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
935 3
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
存储 监控 安全
|
消息中间件 Kafka 开发工具
rsyslog+ELK收集Cisco日志
rsyslog+ELK收集Cisco日志
|
运维 Kubernetes 监控
Loki+Promtail+Grafana监控K8s日志
综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
2179 0

推荐镜像

更多