目 录
一、ELK简介
ELK是由elasticsearch+logstash+kibana三个开源软件的组成的一个组合体,对收集、分析和展示的企业级解决方案,主要优点有:
处理灵活:elasticsearch是实时全文索引,具有强大的搜索功能配置相对简单,API接口使用json接口,logstash使用模块配置,kibana的配置文件部分更简单。
检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百万亿级数据的查询秒级响应。集群线性扩展:elasticsearch和logstash都可以灵活线性扩展。
前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单。
1.1 elasticsearch简介
elasticsearch是一个高度可扩展性的开源全文索引和分析引擎,它可实现数据的实时全文搜索。
搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如nginx,tomcat,系统日志等功能。
使用java语言开发,建立在全文搜索引擎Apache lucene基础之上的搜索引擎
特点:
实时搜索、实时分析
分布式架构、实时文件存储
文档导向,所有对象都是文档
高可用,易扩展,支持集群,分片与分配
接口友好,支持json
1.2 logstash简介
Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。
1.3 kibana简介
Kibana 为 elasticsearch 提 供 一 个 查 看 数 据 的 web 界 面 , 其 主 要 是 通 过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。
1.4 ELK的好处
ELK组件在大数据运维系统中,主要可解决的问题:
日志查询,问题排查,故障恢复,故障自愈
应用日志分析,错误报警
性能分析,用户行为分析
1.5 ELK的工作原理
(1)在所有需要收集日志的服务器上部署logstash,或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署logstash。
(2)logstash收集日志,将日志格式化并输出到elasticsearch群集中。
(3)elasticsearch对格式化后的数据进行索引和存储
(4)kibana从ES群集中查询数据生成图表,并进行前端数据的展示。
总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交给elasticsearch存储,kibana对日志进行可视化处理。
二、部署ELK
全部的服务器配置,所有服务器不低于4G内存
服务器环境角色:三台机子
7-1(Node1)和7-2(Node2)作为elasticsearch存储数据。集群
7-3Node3作为收集日志服务器。
Node1:192.168.114.10Node2:192.168.114.20
Node3:192.168.114.30
前期准备:
systemctl stop firewalld
setenforce 0
都需要java环境,先安装java:
yum install -y java
创建存放源码包的目录:
mkdir /data ; cd /data
2.1 部署elasticsearch(集群)
两台服务器配置一致,后面只需要修改一个地方,名字不同。
以下没有指定说明,主机Node2也同样的操作。
准备rpm包,拖进来。
[root@Node1 data]#:ls
elasticsearch-6.7.2.rpm
解压:rpm -ivh elasticsearch-6.7.2.rpm
[root@Node1 data]#:rpm -ivh elasticsearch-6.7.2.rpm
2.1.1 修改配置文件
进入配置文件的路径,修改配置文件,先备份
[root@Node1 data]#:cd /etc/elasticsearch/
[root@Node1 elasticsearch]#:cp -a elasticsearch.yml elasticsearch.yml.bak
[root@Node1 elasticsearch]#:vim elasticsearch.ym
#做出以下修改,前面数字是行号。
17:cluster.name: my-elk-cluster
23:node.name: node1
24:node.master: true
25:node.data: true
35:path.data: /var/lib/elasticsearch
39:path.logs: /var/log/elasticsearch
45:bootstrap.memory_lock: true
57:network.host: 0.0.0.0
61:http.port: 9200
62:transport.tcp.port: 9300 #手动添加,集群,主机之间通过9300端口相连
71:discovery.zen.ping.unicast.hosts: ["192.168.114.10:9300", "192.168.114.20:9300"] #集群的IP地址,Node1和Node2的IP
过滤出看下修改的地方:
在这个配置文件中,第23行,名字不能一样,这个配置文件,可以远程拷贝到Node2
修改Node2的node.name名字为node2
2.1.2 修改系统参数
2.1.2.1 修改systemmd服务管理器
/etc/systemd/system.conf文件用于配置systemd的,这是一种用于linux操作系统的系统和服务管理器。通过这个文件,你可以自定义与系统操作、性能和行为相关的各种设置。在最后添加配置项:
DefaultLimitNOFILE=65536 #设置打开文件数量的默认限制
DefaultLimitNPROC=32000 #设置进程数量的默认限制
DefaultLimitMEMLOCK=infinity #内存锁
[root@Node1 elasticsearch]#:vim /etc/systemd/system.conf
......
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
2.1.2.2 性能调优参数
最后添加
[root@Node1 elasticsearch]#:vim /etc/security/limits.conf
......
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* soft memlock unlimited
* hard memlock unlimited
2.1.2.3 修改内核参数
一个进程可以拥有的最大内存映射区域数。(分配:2g/262144,4g/4194304,8g/8388608)
[root@Node1 elasticsearch]#:vim /etc/sysctl.conf
......
vm.max_map_count=262144
[root@Node1 elasticsearch]#:sysctl -p
vm.max_map_count = 262144
2.1.3 重启系统,开启elasticsearch服务
reboot
重启后别忘记防火墙和核心防护
systemctl stop firewalld
setenforce 0
开启服务:
[root@Node2 ~]#:systemctl start elasticsearch.service
[root@Node2 ~]#:systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2024-07-17 17:01:10 CST; 4s ago
Docs: http://www.elastic.co
Main PID: 3165 (java)
Tasks: 17
CGroup: /system.slice/elasticsearch.service
└─3165 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFrac...
7月 17 17:01:10 Node2 systemd[1]: Started Elasticsearch.
查看端口号:
9300是集群中与另一台Node2连接的端口。Node2上同理:
这样服务就起来了,elasticsearch集群。
去主机查看节点状态
192.168.114.10:9200
192.168.114.20:9200
查看群集的健康情况,可以看到status值为green(绿色),表示节点健康运行
192.168.114.10:9200/_cluster/health?pretty
192.168.114.20:9200/_cluster/health?pretty
2.1.4 浏览器中插件elasticsearch
在谷歌浏览器中下载插件,也可以在其他浏览器上找插件。
插件下载:点击谷歌浏览器右上角三个点(更多)->找到扩展程序,找到管理扩展程序->在搜索栏中搜索elasticsearch。点击下载。
下载好,在右上角点击插件,能够看到我们下载的插件,Multi Elasticsearch Head。
点击。
打开插件后,点击new,在弹出的数据框中数据http://192.168.114.10:9200
点击确定。
可以看到集群健康值为green。有两个节点,我们自定义的名字。
这个插件如果装不起来,也可以在本机默认浏览器试试这个地址下载插件:https://www.chajianxw.com/
2.2 部署logstash
logstash是部署在应用服务器Node3上的,用于手机日志文件
准备源码包:
[root@Node3 data]#:ls
kibana-6.7.2-x86_64.rpm logstash-6.7.2.rpm
解压logstash:
[root@Node3 data]#:rpm -ivh logstash-6.7.2.rpm
启动服务:
[root@Node3 data]#:systemctl start logstash.service
[root@Node3 data]#:systemctl status logstash.service
● logstash.service - logstash
Loaded: loaded (/etc/systemd/system/logstash.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2024-07-17 18:21:36 CST; 6s ago
Main PID: 7425 (java)
Tasks: 17
CGroup: /system.slice/logstash.service
└─7425 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFrac...
7月 17 18:21:36 Node3 systemd[1]: Started logstash.
为了能够补全logstash命令,做个软链接:
[root@Node3 data]#:ln -s /usr/share/logstash/bin/logstash /usr/bin
可以直接logstash命令执行了,不用再绝对路径了
logstash命令选项:
-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作Logstash的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
-t:测试配置文件是否正确,然后退出。
可以本地测试一下,标准输入标准输出:logstash -e 'input { stdin{} } output { stdout {} }'
[root@Node3 data]#:logstash -e 'input { stdin{} } output { stdout {} }'
......
[INFO ] 2024-07-17 18:27:54.353 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2024-07-17 18:27:54.806 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
#此处输入
由于是本地输入输出并不会在插件上显示。 看到successfully
ctrl + C退出。
如果想要使用logstash将信息写入elasticsearch中,需要执行elasticsearch块,指定主机。
[root@Node3 data]#:logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.114.10:9200"] } }'
......
[INFO ] 2024-07-17 18:33:39.014 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2024-07-17 18:33:39.610 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
#输入内容
这里输入内容并不会向上面那样,因为我们指定了output是elasticsearch插件中,并指定了输出的主机为192.168.114.10。
我们去谷歌浏览器刷新一下:在概览中发现多了一项。
那么怎么查看我们输入的内容呢?上面一栏中有个数据浏览,点击。
有个索引为logstash,后跟日期,是以json格式显示出来的,能明显在message键中看到值为hello world!!!的内容。
除此之外!一般都是用配置文件,来输入输出内容。
进入配置文件:
[root@Node3 data]#:cd /etc/logstash/conf.d/
[root@Node3 conf.d]#:ls
[root@Node3 conf.d]#:
创建一个系统日志的配置文件。固定格式
[root@Node3 conf.d]#:vim system-log.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => [ "192.168.114.10:9200","192.168.114.20:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
input指定本地的输入文件,path路径,tpye类型,start_position从当前开始。output输出到哪里,elasticsearch插件,hosts集群中的IP地址,index索引输出的格式
但是我们path路径下的messages这个日志文件要具有读的权限。
启动logstash:logstash -f system-log.conf
[root@Node3 conf.d]#:logstash -f system-log.conf
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
......
[INFO ] 2024-07-17 18:50:09.998 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2024-07-17 18:50:10.386 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}
看到successfully成功后,去浏览器上查看。
我们指定的索引名字,systemctl+日期。年.月.日
我们的配置文件中指定了格式:index => "system-%{+YYYY.MM.dd}"
查看数据浏览:在右侧能够看到/var/log/messages文件中的所有日志信息。
这里太多了,于是就又出现了一个图形化界面的工具。kibana
2.3 部署kibana图形化工具
解压kibana,进入配置文件。
[root@Node3 data]#:rpm -ivh kibana-6.7.2-x86_64.rpm
警告:kibana-6.7.2-x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:kibana-6.7.2-1 ################################# [100%]
[root@Node3 data]#:cd /etc/kibana/
[root@Node3 kibana]#:ls
kibana.yml
修改配置文件,先做个备份。
修改以下配置项。
[root@Node3 kibana]#:cp -a kibana.yml kibana.yml.bak
[root@Node3 kibana]#:vim kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.114.10:9200","http://192.168.114.20:9200"]
kibana.index: ".kibana"
logging.dest: /var/log/kibn.log
i18n.locale: "zh-CN"
查看修改了哪些,在第几行。
-v反选:过滤注释行和空行。反选了,除此之外的行
-n显示行号
-E开启扩展正则表达式
[root@Node3 kibana]#:grep -vnE "^#|^$" kibana.yml
2:server.port: 5601 #第2行,打开端口
7:server.host: "0.0.0.0" #第7行,监听地址
28:elasticsearch.hosts: ["http://192.168.114.10:9200","http://192.168.114.20:9200"] #集群服务器
37:kibana.index: ".kibana" #打开索引
96:logging.dest: /var/log/kibn.log #指定日志文件,这个日志文件需要手动创建
113:i18n.locale: "zh-CN" #中文设置
创建日志,修改属主属组,启动服务,查看状态。
看端口:是起来的
图形化工具安装成功。在浏览器输入:
192.168.114.30:5601
使用:
点击自己浏览
点discover:
成功,搜索到一个索引。点下一步
按时序排序,点创建索引模式
看到一个索引。
查看索引。
查看我们所需要的字段。
三、管理nginx日志
在Node3上安装nginx服务。
安装epel源和nginx。
[root@Node3 kibana]#:yum install -y epel-release.noarch
[root@Node3 kibana]#:yum install -y nginx
修改日志格式为json格式。
把原本的日志格式注释,添加自定义的格式:json格式
http {
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
access_log /var/log/nginx/access.log access_json;
......
}
启动nginx:
[root@Node3 kibana]#:systemctl start nginx
使用其他主机访问nginx:
[root@Node4 ~]#:curl 192.168.114.30
在Node3上查看日志:
日志为json格式了。接下来做logstash。
修改logstash配置文件。
[root@Node3 kibana]#:cd /etc/logstash/conf.d/
[root@Node3 conf.d]#:ls
system-log.conf
[root@Node3 conf.d]#:vim nginx-log.conf
input {
file {
path => "/var/log/nginx/access.log"
type => "nginx"
start_position => "beginning"
stat_interval => "3"
codec => "json"
}
}
output {
elasticsearch {
hosts => ["192.168.114.10:9200","192.168.114.20:9200"]
index => "nginx-log-%{+YYYY.MM.dd}"
}
}
解释:
stat_interval指定每三秒刷新一次
codec指定json格式
这个日志文件要具有读的权限:
执行logstash。看到successfully
[root@Node3 conf.d]#:logstash -f nginx-log.conf
......
[INFO ] 2024-07-17 22:24:14.244 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2024-07-17 22:24:14.564 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}
然后去浏览器刷新页面能看到索引为nginx-log-[时间]
也可以在kibana图形化页面添加索引:
第二步就是选择时序:
创建好之后,点击discover,可以看到日志:
我们添加一个字段,查看状态;
用Node2:192.168.114.20访问nginx:故意访问一个错误页面
刷新一下,查看状态。
下面的tomcat也一样:
四、管理tomcat日志
tomcat的安装略。我这里直接跑脚本了。
同理,tomcat先去修改脚本格式,改为json格式。修改最后一行。
[root@Node3 data]#:cd /usr/local/tomcat/conf/
[root@Node3 conf]#:vim server.xml
......
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".log"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}" />
directory存放目录可以不改
prefix改成tomcat开头
suffix改成log结尾
重启:
[root@Node3 conf]#:systemctl restart tomcat.service
[root@Node3 conf]#:ss -natp | grep 8080
LISTEN 0 100 [::]:8080 [::]:* users:(("java",pid=6484,fd=56))
重启后有了配置文件:
使用另一台访问tomcat:curl 192.168.114.30:8080
故意访问错误页面
查看一下日志:
修改配置文件:
[root@Node3 logs]#:cd /etc/logstash/conf.d/
[root@Node3 conf.d]#:vim tomcat_access_log.conf
input {
file {
path => "/usr/local/tomcat/logs/tomcat_access_log.*.log"
type => "tomcat-acceslog"
start_position => "beginning"
stat_interval => "3"
codec => "json"
}
}
output {
elasticsearch {
hosts => ["192.168.114.10:9200","192.168.114.20:9200"]
index => "tomcat-access-log-%{+YYYY.MM.dd}"
}
}
启动logstash:
[root@Node3 conf.d]#:logstash -f tomcat_access_log.conf
......
[INFO ] 2024-07-17 23:37:04.297 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2024-07-17 23:37:04.618 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}
去页面刷新:
去图形化界面:
同样方式,去管理创建索引。tomcat关键字
去discover查看:
与nginx查询字段同理,添加字段。
可以根据需求,选择相应的字段。查看日志。
---end---