ELK日志分析系统是Logstash、Elasticsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示、三大组件构成的一个基于web页面的日志分析工具。
注:日志分析是运维工程师解决系统故障,发现问题的主要手段。日志包含多种类型,包括程序日志,系统日志以及安全日志等。通过对日志分析,预发故障的发生,又可以在故障发生时,寻找到蛛丝马迹,快速定位故障点。及时解决。
提供了一个分布式多用户能力的全文搜索引擎
接近实时(NRT): Elasticsearch是一个搜索速度接近实时的搜索平台,响应速度非常的快,从索引一个文档直到能够被搜索到只有一个轻微的延迟(通常是1s)
群集(cluster): 群集就是由一个或多个节点组织在一起,在所有的节点上存放用户数据,并一起提供索引和搜索功能。通过选举产生节点,并提供跨节点的联合索引和搜索的功能。每个群集都有一个唯一的表示名称,默认是Elasticsearch,每个节点是基于群集名字加入到其群集中的。一个群集可以只有一台节点,为了具备更好的容错性,通常配置多个节点,在配置群集时,建议配置成群集模式。
节点(node): 是指一台单一的服务器,多个节点组织为一个群集,每个节点都存储数据并参与群集的索引和搜索功能。和群集一样,节点也是通过名字来标识的。默认情况下,节点名字是随机的,也可以自定义。
索引(index): 类似于关系型数据库中的“库”,当索引一个文档后,就可以使用elasticsearch搜索到该文档,也可以简单地将索引理解为存储数据库的地方,可以方便地进行全文索引。
分片和副本(shards&replicas): elasticsearch将索引分成若干个部分,每个部分称为一个分片,每个分片就是一个功能的独立索引。分片的数量一般在索引创建前指定,且创建索引后不能更改。
Logstash由JRuby语言编写,运行在Java虚拟机上,是一款强大的数据库处理工具,可以实施数据传输,格式处理,格式化输出。Logstash具有强大的插件功能,常用于日志处理。Logstash可配置单一的代理端,与其他开源软件结合,以实现不同的功能。
它只做三件事:数据输入;数据输出;数据加工(如加工、更改等)。
Shipper:日志收集者。负责监控本地日志文件的变化,及时收集最新的日志文件内容。
Indexer:日志存储者。负责接收日志并写入到本地文件。
Broker:日志Hub。负责连接多个Shipper和多个Indexer。
Search and Storage:允许对事件进行搜索和存储。
Web Interface:基于Web的展示界面。
注:组件在Logstash架构中可独立部署,才能提供更好的群集扩展性。在Logstash中包含三个阶段,分别是输入(Input)、处理(Filter非必要)和输出(Output)
Kibana是一个针对Elasticsearch的开源分析及可视化平台,主要设计用来和Elasticsearch一起工作,可以搜索,查看存储在Elasticsearch搜索中的数据,并通过各种表进行高级数据分析及展示。
Kibana可以让数据看起来一目了然。他操作简单,基于浏览器的用户界面管理方式,用户可以在任何地点任何时间都可以实时监控。
Elasticsearch无缝之集成,kibana架构是为Elasticsearch定制的,可以将任何(结构化和非结构化)数据加入Elasticsearch索引。
整合数据:Kibana可以让海量数据变得更容易理解,根据数据内容可以创建形象的柱形图,折线图、散点图、直方图等以便用户查看。
复杂数据分析:Kibana提升了Elasticsearch的分析能力,能够更加智能地分析数据,执行数学转换并根据要求对数据切割分块。
接口灵活:使用Kibana可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。
注:防火墙一定要关闭
环境:
版本:CentOS7
准备三台虚拟机,内存条需要2,4G以上内存,内存小了怕运行不起节点
192.168.100.2 Apache
192.168.100.3 node1
192.168.100.4 node2
配置ELK日志分析群集
使用Logstash收集日志
使用Kibana查看分析日志
把软件放入自己创建的aaa文件里面
[root@node1 aaa]# ll elk/ //查看放入的软件包
总用量 265132
-rw-r--r--. 1 root root 33396354 1月 6 18:50 elasticsearch-5.5.0.rpm
-rw-r--r--. 1 root root 37926436 1月 6 18:50 elasticsearch-head.tar.gz
-rw-r--r--. 1 root root 52255853 1月 6 18:50 kibana-5.5.1-x86_64.rpm
-rw-r--r--. 1 root root 94158545 1月 6 18:50 logstash-5.5.1.rpm
-rw-r--r--. 1 root root 30334692 1月 6 18:50 node-v8.2.1.tar.gz
-rw-r--r--. 1 root root 23415665 1月 6 18:50 phantomjs-2.1.1-linux-x86_64.tar.bz2
配置主机名并配置host文件以便DNS解析
注:节点都要配置
vim /etc/hosts
192.168.100.3 node1
192.168.100.4 node2
检查本机是否存在Java环境
//没有就安装yum -y install java
java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
部署elasticsearch软件
//先解压elasticsearch-5.5.0.rpm
[root@node1 elk]# rpm -ivh elasticsearch-5.5.0.rpm
//加载系统服务
systemctl daemon-reload
systemctl enable elasticsearch.service
更改elasticsearch主配置文件
cd /etc/elasticsearch/
[root@node1 elasticsearch]# cp elasticsearch.yml elasticsearch.yml.bak
vi /etc/elasticsearch/elasticsearch.yml
//set nu
17 cluster.name: my-elk-cluster
23 node.name: node1
33 path.data: /data/elk_data
37 path.logs: /var/log/elasticsearch/
43 bootstrap.memory_lock: false
55 network.host: 0.0.0.0
59 http.port: 9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
//反向查看除#开头的数据
cluster.name: my-elk-cluster //群集名称
node.name: node1 //节点名称
path.data: /data/elk_data //数据存放路径
path.logs: /var/log/elasticsearch/ //日志文件存放路径
bootstrap.memory_lock: false //启动时不能锁定内存
network.host: 0.0.0.0 //提供服务绑定IP地址,0000代表所有地址
http.port: 9200 //侦听端口
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
//群集发现通过单薄实
创建数据存放路径授权
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/
[root@node2 data]# ll
总用量 0
drwxr-xr-x. 2 elasticsearch elasticsearch 6 1月 6 20:15 elk_data
//启动elasticsearc是否成功开启
systemctl start elasticsearch.service
//可能要等一小会
netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 57855/java
火狐查看node1节点192.168.100.3:9200
Host192.168.100.3:9200
http://192.168.100.4:9200/_cluster/health?pretty检查群集健康情况:/_cluster/health?pretty
http://192.168.100.4:9200/_cluster/state?pretty 检查群集状况信息:/_cluster/state?pretty
node2节点配置跟node1就节点名称不一样。
[root@node2 ~]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node2
path.data: /data/elk_bata
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
注:要想更方便管理群集,可以通过安装Elasticsearch插件,上述查看群集方式及其不方便
lasticsearch在5.0版本过后,Elasticsearch-head插件需要做独立服务进行安装,需要npm命令。安装Elasticsearch-head需要提前把node和phantomjs软件包安装好。Node是一个基于Chrome V8引擎的JavaScript运行环境,而phantomjs是一个基于webkit的JavaScriptAPI。可以理解为一个隐形的浏览器,任何基于webkit浏览器做的事情,它都可以做到。
注:软件包放在aaa/elk
编译安装node组件依赖包
yum install gcc gcc-c++ make -y
cd /aaa/elk/
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j3 //有点久慢慢等
make install
安装phanytomjs前端框架
注:上传软件包到/usr/local/src/目录
cd /aaa/elk/
//软件包到/usr/local/src/目录
[root@node1 elk]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
[root@node1 elk]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# ll
总用量 66340
-rwxr-xr-x. 1 root root 67932064 1月 25 2016 phantomjs
cp phantomjs /usr/local/bin/
安装elasticsearch-head
cd /aaa/elk/
//件包到/usr/local/src/目录
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
.......
up to date in 1.718s
修改Elasticsearch主配置文件
注:最后一行添加
vi /etc/elasticsearch/elasticsearch.yml
http.cors.enabled:true
//开启跨域访问支持,默认false
http.cors.allow-origin: "*"表示所有IP地址
//跨域访问的域名地址,"*"表示所有IP地址
启动elasticsearch-head服务器
cd /usr/local/src/elasticsearch-head/
//将服务位置放置后台允许一旦中断 服务也会一起关闭
[root@node1 elasticsearch-head]# npm run start &
[1] 105440
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
>
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
查看服务9100,9200启动没有
netstat -anpt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 105450/grunt
[root@node2 ~]# systemctl start elasticsearch.service
[root@node2 ~]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 102582/java
火狐查看node1节点192.168.100.3:9100,节点192.168.100.4:9100情况
注:网页浏览Elasticsearch信息:(健康值为绿色)
尝试索引为index-demo
注:索引默认被分片5个,并且一个副本
注:用红色框起来的是副本数,黑色是主分数
192.168.100.2 Apache
Logstash一般部署在需要监控其他日志的服务器中
安装Logstash并做一些日志搜索输出到elasticsearch中
先安装Apache服务器(httpd)
yum -y install httpd
systemctl start httpd
netstat -anpt | grep httpd
tcp6 0 0 :::80 :::* LISTEN 64157/httpd
安装java环境
java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
安装Logstash
cd /aaa/elk //软件包存放地
[root@apache elk]# rpm -ivh logstash-5.5.1.rpm
systemctl start logstash.service
systemctl enable logstash.service
//建立logstash软连接
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
Logstash这个命令字段解释
-f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e 后面跟着字符串该字符串可以被当做logstash的配置(如果是” ”,则默认使用stdin做为输入、stdout作为输出)
—t 测试配置文件是否正确,然后退出
输入采用标准输入,输出采用标准输出
logstash -e 'input { stdin{} } output { stdout{} }'
.......
PI endpoint {
:port=>9600} //下面输入
www.taobao.com
2021-01-06T16:32:30.215Z apache www.taobao.com
rubydebug显示详细输出
//codec为一种编辑码器
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
.......
PI endpoint {
:port=>9600}
www.baidu.com
{
"@timestamp" => 2021-01-06T16:35:20.072Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
使用logstash将信息写入elasticsearch中
logstash -e 'input { stdin{} } output { elasticsearch { hosts=92.168.100.3:9200"] } }'
......
PI endpoint {
:port=>9600}
www.baidu.com
www/^H^H^H^H^[[3~
www.taobao.com
//www开头是写入的内容
Logstash配置文件主要由三部分组成: input、 output、filter(根据需要)
下面配置通过修改Logstash配置文件,让收集系统日志/var/log/messages,并将其输出到Elasticsearch中。
chmod o+r /var/log/messages
[root@apache ~]# ll /var/log/messages
-rw----r--. 1 root root 602104 1月 7 00:54 /var/log/messages
vim /etc/logstash/conf.d/system.conf
//添加以下内容
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => [ "192.168.100.3:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
systemctl restart logstash.service
查看192.168.100.3:9100/ 查看索引信息
node1主机安装 kibana
cd /aaa/elk/
[root@node1 elk]# rpm -ivh kibana-5.5.1-x86_64.rpm
cd /etc/kibana/
[root@node1 kibana]# ll
总用量 8
-rw-r--r--. 1 root root 4649 7月 19 2017 kibana.yml
cp kibana.yml kibana.yml.bak
root@node1 kibana]# ll
总用量 16
-rw-r--r--. 1 root root 4649 7月 19 2017 kibana.yml
-rw-r--r--. 1 root root 4647 1月 7 01:13 kibana.yml.bak
修改kibana配置
vi kibana.yml
2 server.port: 5601 //Kibana的端口
7 server.host: "0.0.0.0" //侦听的地址
21 elasticsearch.url: "http://192.168.100.3:9200" //和Elasticsearch 建立连接
30 kibana.index: ".kibana" //在Elasticsearch 中添加.Kibana索引
启动 kibana
[root@node1 kibana]# systemctl restart kibana.service
[root@node1 kibana]# netstat -anpt | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 107471/node
浏览器访问http://192.168.100.3:5601
*创建了system-索引
注:有什么错误可以直接查看,推荐谷歌浏览器可以翻译
192.168.100.2Apache页面添加
cd /etc/logstash/conf.d/
touch apache_log.conf
root@apache conf.d]# vim apache_log.conf
input {
file{
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.100.3:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.100.3:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# vim apache_log.conf
start_position => “beginning”:从日志的开头开始
注:先正确访问以下192.168.100.2Apache页面
访问Elasticsearch192.168.100.3:9100查看索引
再去访问kibana192.168.100.3:5601 创建apache_access,error
注:名字apache_access不要搞错