日志管理之ELK
ELK介绍
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称(但是后期出现的filebeat(beats中的一种)可以用来替代logstash的数据收集功能,比较轻量级)。市面上也被成为Elastic Stack。
Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。
Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎,是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。并且可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以汇总、分析和搜索重要数据日志。还可以让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态
为什么要使用ELK
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
ELK基础架构
1、以Logstash 作为日志搜集器

这种结构因为需要在各个服务器上部署 Logstash,而它比较消耗 CPU 和内存资源,所以比较适合计算资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作。
2、以Beats 作为日志搜集器
这种架构引入 Beats 作为日志搜集器。目前 Beats 包括
# Packetbeat(搜集网络流量数据) # Filebeat(搜集文件数据) # Winlogbeat(搜集 Windows 事件日志数据) # Metricbeat (收集操作系统和服务器的运行指标(CPU,内存,硬盘,IO,读写速度,进程等等)) # Heartbeat 运行时间监控 (收集系统运行时的数据) # Auditbeat 审计数据 (收集审计日志) # Functionbeat # Journalbeat 分析Journald日志
Beats 将搜集到的数据发送到 Logstash,经 Logstash 解析、过滤后,将其发送到 Elasticsearch 存储,并由 Kibana 呈现给用户。

这种架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。另外,Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。
因此这种架构适合对数据安全性要求较高,同时各服务器性能比较敏感的场景。
3、引入消息队列模式
Beats 还不支持输出到消息队列(新版本除外:5.0版本及以上),所以在消息队列前后两端只能是 Logstash 实例。logstash从各个数据源搜集数据,不经过任何处理转换仅转发出到消息队列(kafka、redis、rabbitMQ等),后logstash从消息队列取数据进行转换分析过滤,输出到elasticsearch,并在kibana进行图形化展示

模式特点:这种架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析节点和 Elasticsearch 的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性,但依然存在 Logstash 占用系统资源过多的问题
工作流程:Filebeat采集—> logstash转发到kafka—> logstash处理从kafka缓存的数据进行分析—> 输出到es—> 显示在kibana
安装ElasticSearch
注意:内存要求建议4G、关闭防火墙、selinux
下载ES:https://www.elastic.co/cn/downloads/elasticsearch
ES中文文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
# 第一步:下载tar包解压到指定目录 mkdir /app/ tar xf elasticsearch-7.7.0-linux-x86_64.tar.gz -C /app/ ln -s /app/elasticsearch-7.7.0/ /app/elsearch # 第二步:配置java环境(这里我就使用elasticsearch包自带的java) echo 'export PATH=$PATH:/app/elasticsearch-7.7.0/jdk/bin/' >>/etc/profile source /etc/profile java --version openjdk 14 2020-03-17 OpenJDK Runtime Environment AdoptOpenJDK (build 14+36) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14+36, mixed mode, sharing) # 第三步:创建用户(elsearch默认elasticsearch是禁止root用户启动,并配置好visudo) useradd elsearch chown -R elsearch.elsearch /app/elsearch/ echo '123456'|passwd --stdin elsearch su - elsearch # 切换用户(配置好sudo权限) # 第四步:修改配置文件 cat /app/elsearch/config/elasticsearch.yml |egrep -v "(^$|#)" cluster.name: app-elk # 集群名称 node.name: elk-node01 # 节点名称 # bootstrap.memory_lock: true # 锁住内存,使内存不会再swap中使用 # Centos6不支持SecComp CentOS6中需要设置 # bootstrap.system_call_filter: false network.host: 0.0.0.0 # 允许访问的ip http.port: 9200 # 端口 cluster.initial_master_nodes: ["elk-node01"] http.cors.enabled: true # #如果启用了 HTTP 端口,那么此属性会指定是否允许跨源 REST 请求。 http.cors.allow-origin: "*"
启动(启动不能使用root用户)
./bin/elasticsearch # 会发现如下几行错误 [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] [2]: max number of threads [3795] for user [elsearch] is too low, increase to at least [4096] [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决
# 增加最大内存映射数 echo 'vm.max_map_count=655360' >>/etc/sysctl.conf sudo sysctl -p # 生效 # 增加最大进程数 vim /etc/security/limits.conf # 后面追加 * soft nofile 65536 * hard nofile 65536 * soft nproc 2048 * hard nproc 4096
访问:ip+端口

安装head插件安装
https://github.com/mobz/elasticsearch-head #head官网
https://nodejs.org/zh-cn/download/ #nodejs下载
官方说明,elasticsearch7有三种方式使用head插件
第一种:使用谷歌浏览器head插件,这个直接在谷歌浏览器上面安装插件就可以使用了
第二种:使用head服务(把head当做一个服务来使用),安装如下
git clone git://github.com/mobz/elasticsearch-head.git mv elasticsearch-head /app/ cd /app/elasticsearch-head chown -R elsearch.elsearch /app/elasticsearch-head/ # yum -y install npm npm install npm run start 在elasticsearch.yml下追加如下内容并重启 http.cors.enabled: true http.cors.allow-origin: "*"

Kibana部署
下载Kibana:https://www.elastic.co/cn/downloads/kibana
Kibana中文手册:https://www.elastic.co/guide/cn/kibana/current/index.html
tar xf kibana-7.7.0-linux-x86_64.tar.gz -C /app/ ln -s /app/kibana-7.7.0-linux-x86_64/ /app/kibana chown -R elsearch.elsearch /app/kibana/ cat /app/kibana/config/kibana.yml |egrep -v '^$|#' server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://192.168.1.40:9200"] elasticsearch.preserveHost: true kibana.index: ".kibana" nohup /app/kibana/bin/kibana &
访问ip+端口

logstash
logstash是怎么工作的呢?
Logstash是一个开源的、服务端的数据处理pipeline(管道),它可以接收多个源的数据、然后对它们进行转换、最终将它们发送到指定类型的目的地。Logstash是通过插件机制实现各种功能的,读者可以在https://github.com/logstash-plugins 下载各种功能的插件,也可以自行编写插件。
Logstash实现的功能主要分为接收数据、解析过滤并转换数据、输出数据三个部分,对应的插件依次是input插件、filter插件、output插件,其中,filter插件是可选的,其它两个是必须插件。也就是说在一个完整的Logstash配置文件中,必须有input插件和output插件。
- 常用的input插件
#-file:读取一个文件,这个读取功能有点类似于linux下面的tail命令,一行一行的实时读取。 #-syslog: 监听系统514端口的syslog messages,并使用RFC3164格式进行解析。 #-redis: Logstash可以从redis服务器读取数据,此时redis类似于一个消息缓存组件。 #-kafka:Logstash也可以从kafka集群中读取数据,kafka加Logstash的架构一般用在数据量较大的业务场景,kafka可用作数据的缓冲和存储。 #-filebeat:filebeat是一个文本日志收集器,性能稳定,并且占用系统资源很少,Logstash可以接收filebeat发送过来的数据。
- 常见的filter插件
#filter插件主要用于数据的过滤、解析和格式化、也就是将非结构化的数据解析成结构化的、可查询的标准化数据。常见的filter插件有如下几个: #-grok:grok是logstash最重要的插件,可解析并结构化任意数据,支持正则表达式,并提供了很多内置的规则和模板可供使用, #-mutate:此插件提供了丰富的基础类型数据处理能力,包括类型转换,字符串处理和字段处理。 #-date:此插件可以用来转换你的日志记录中的时间字符串。 #-GeoIP:此插件可以根据IP地址提供对用的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。
- 常用的output
#-elasticsearch:发送数据到elasticsearch #-file:发送数据到文件中 #-redis:发送数据到redis中,从这里可以看出redis插件既可以用在input插件中,也可以用在output插件中。 #-kafka:发送数据到kafka中,与redis插件类似,此插件也可以用在logstash的输入和输出插件中。
下载地址:https://www.elastic.co/cn/downloads/logstash
logstash文档:https://www.elastic.co/guide/en/logstash/current/introduction.html
通过logstash进行日志收集
tar xf logstash-7.7.0.tar.gz -C /app/ ln -s /app/logstash-7.7.0/ /app/logstash chown -R elsearch.elsearch /app/logstash/ cd /app/logstash/ # 测试是否安装成功 ./bin/logstash -e 'input { stdin { } } output { stdout {} }' mkdir conf.d/ # 默认是没有这个目录的,我们配置文件就写在这个目录 cp config/logstash-sample.conf conf.d/ cd conf.d/ mv logstash-sample.conf logstash_to_elsearch.conf # 改名 # 修改配置文件 egrep -v "(^$|#)" logstash_to_elsearch.conf input { file { path => "/var/log/messages" type => "syslog" } } output { elasticsearch { hosts => ["192.168.1.40:9200"] index => "messages-log-%{+YYYY.MM.dd}" } } # 收集的日子必须有可读权限 chmod 744 /var/log/messages # 启动 ./bin/logstash -f conf.d/logstash_to_elsearch.conf ......... [2020-10-02T20:16:09,205][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
注意:上面我们创建了目录一定要检查目录权限
收集多个文件日志写法
cat /app/logstash/conf.d/logstash_to_elasticsearch.yml
input {
file {
path => "/var/log/messages"
type => "systemlog"
}
file {
path => "/var/log/secure"
type => "securelog"
}
}
output {
if [type] == "systemlog" {
elasticsearch {
hosts => ["192.168.1.40:9200"]
index => "messages-log-%{+YYYY.MM.dd}"
}
}
if [type] == "securelog" {
elasticsearch {
hosts => ["192.168.1.40:9200"]
index => "secure-log-%{+YYYY.MM.dd}"
}
}
}
打开kibana


这种架构就实验玩玩,生产环境不建议使用(生产环境大部分都使用第二种或者第三种架构)
安装filebeat
接下来我们引入beat来进行数据收集,当然beat只是一个统称你可以简单理解他是工具集。里面包含了多种工具(上面我们已经介绍过了),这里我们就拿beat下的filebeat来实验
下载地址:https://www.elastic.co/cn/downloads/beats
说明文档:https://www.elastic.co/guide/en/beats/filebeat/current/index.html
# 停掉logstash,修改logstash配置文件 egrep -v "(^$|#)" logstash_to_elsearch.conf input { beats { port => 5044 } } output { elasticsearch { hosts => ["192.168.1.40:9200"] index => "messages-log-%{+YYYY.MM.dd}" } } # 启动logstash nohup ./bin/logstash -f conf.d/logstash_to_elsearch.conf & # 安装filebeat,通过filebeat进行日志收集 tar xf filebeat-7.7.0-linux-x86_64.tar.gz -C /app/ ln -s /app/filebeat-7.7.0-linux-x86_64/ /app/filebeat chown -R elsearch.elsearch /app/filebeat cd /app/filebeat cp filebeat.yml filebeat.yml.bat # 备份 # 修改配置文件 egrep -v "(^$|#)" filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/messages filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: true setup.template.settings: index.number_of_shards: 1 setup.kibana: host: "192.168.1.40:5601" output.logstash: hosts: ["192.168.1.40:5044"] processors: - add_host_metadata: ~ - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~ ./filebeat -e -c filebeat.yml # 为了效果 echo '888888888888888888' >>/var/log/messages
查看

可以看到大部分日志内容都是没用的,我们可以排除或者过滤他,通过修改filebeat.yml文件
排除通过exclude_lines: ['^DBG'],只想要某些日志: include_lines: ['^ERR', '^WARN']参数
想要深入了解ElasticSearch、logstash、kibana、beat等我下篇文章

浙公网安备 33010602011771号