ELK简介:
ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台(开源实时日志分析ELK平台部署)
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。
kibana 也是一个开源和免费的工具,他Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。 工作原理如下所示:
在需要收集日志的所有服务上部署logstash,作为logstash agent(logstash shipper)用于监控并过滤收集日志,将过滤后的内容发送到logstash indexer,logstash indexer将日志收集在一起交给全文搜索服务ElasticSearch,可以用ElasticSearch进行自定义搜索通过Kibana 来结合自定义搜索进行页面展示。
四大组件:
Logstash: logstash server端用来搜集日志;
Elasticsearch: 存储各类日志;
Kibana: web化接口用作查寻和可视化日志;
Logstash Forwarder: logstash client端用来通过lumberjack 网络协议发送日志到logstash server;
ELK帮助手册
ELK官网:https://www.elastic.co/
ELK官网文档:https://www.elastic.co/guide/index.html
ELK中文手册:
安装配置
注释:
ELK有两种安装方式
(1)集成环境:Logstash有一个集成包,里面包括了全套的三个组件,也就是安装一个集成包。
(2)独立环境:三个组件分别单独安装、运行、各司其职。(比较常用)
此次方案也用第二种方案
1、 安装JDK
logstash的运行依赖于Java运行环境。
[root@localhost1 ~]# yum -y install java-1.8.0-openjdk.x86_64
[root@localhost1 ~]# java -version #Java的版本很重要,可能会导致下面报错
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
安装logstash
wget https://download.elastic.co/logstash/logstash/logstash-1.5.4.tar.gz
tar zxf logstash-1.5.4.tar.gz
mv logstash-1.5.4 /usr/local/logstash
echo "export PATH=$PATH:/usr/local/logstash/bin" > /etc/profile.d/logstash.sh
source /etc/profile
3、logstash常用参数
-e :指定logstash的配置信息,可以用于快速测试;
-f :指定logstash的配置文件;可以用于生产环境;
4、启动logstash
通过-e参数指定logstash的配置信息,用于快速测试,直接输出到屏幕。
[root@localhost1 ~]# logstash -e "input {stdin{}} output {stdout{}}"
!!! Please upgrade your java version, the current version '1.6.0_41-b41' may cause problems. We recommend a minimum version of 1.7.0_51
Logstash startup completed
hello word #手动输入后回车,下为返回结果
2017-07-20T20:11:47.724Z localhost1 hello word
这种输出是直接原封不动的返回...
通过-e参数指定logstash的配置信息,用于快速测试,以json格式输出到屏幕
[root@localhost1 ~]# logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
!!! Please upgrade your java version, the current version '1.6.0_41-b41' may cause problems. We recommend a minimum version of 1.7.0_51
Logstash startup completed
my name is wolf #输入
{
"message" => "my name is wolf",
"@version" => "1",
"@timestamp" => "2017-07-20T20:09:29.933Z",
"host" => "localhost1" #host文件有映射才会显示主机名,否则为4个0
}
这种输出是以json格式的返回.
5、logstash以配置文件方式启动
输出信息到屏幕
[root@localhost1 ~]# vim logstash-simple.conf
input { stdin {} }
output {
stdout { codec=> rubydebug }
}
[root@localhost1 ~]# logstash -f logstash-simple.conf //普通方式启动
!!! Please upgrade your java version, the current version '1.6.0_41-b41' may cause problems. We recommend a minimum version of 1.7.0_51
Logstash startup completed
hello word
{
"message" => "hello word",
"@version" => "1",
"@timestamp" => "2017-07-20T20:17:43.350Z",
"host" => "localhost1"
}
[root@localhost1 ~]# logstash agent -f logstash-simple.conf –verbose //开启debug模式
!!! Please upgrade your java version, the current version '1.6.0_41-b41' may cause problems. We recommend a minimum version of 1.7.0_51
Logstash startup completed
hello world
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2017-07-20T20:19:01.748Z",
"host" => "localhost1"
}
效果同命令行配置参数一样
Elasticsearch
安装
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.tar.gz
[root@localhost1 ~]# tar zxf elasticsearch-1.7.2.tar.gz
[root@localhost1 ~]# mv elasticsearch-1.7.2 /usr/local/elasticsearch
[root@localhost1 ~]# cp /usr/local/elasticsearch/config/elasticsearch.yml{,.bak}
[root@localhost1 ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml
321 discovery.zen.ping.multicast.enabled: false #注释去掉,为关闭广播,如果局域网有机器占9300端口,服务会启动不了
212 network.host: 192.168.8.10 #注释去掉,修改为指定主机地址,其实可选,但最好指定因为后面跟kibana集成的时候会报http连接出错(直观体现为监听:::9200 而不是0.0.0.0:9200)
322 http.cors.allow-origin: "/.*/"
323 http.cors.enabled: true #加入这两项都是解决与kibana集成的问题,错误体现是elasticsearch版本过低,其实并不是
启动
[root@localhost1 ~]# /usr/local/elasticsearch/bin/elasticsearch #日志会输出到stdout
[root@localhost1 ~]# /usr/local/elasticsearch/bin/elasticsearch -d #表示以daemon的方式启动
[root@localhost1 ~]# nohup /usr/local/elasticsearch/bin/elasticsearch > /var/log/logstash.log 2>&1 &
安装插件
所有插件可以去
进行搜索
安装elasticsearch-kopf插件
Elasticsearch-kopf插件可以查询Elasticsearch中的数据,安装elasticsearch-kopf,只要在你安装Elasticsearch的目录中执行以下命令即可:
[root@localhost1 bin]# pwd
/usr/local/elasticsearch/bin
[root@localhost1 bin]# ./plugin install lmenezes/elasticsearch-kopf
-> Installing lmenezes/elasticsearch-kopf...
Trying https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip...
Downloading .............................................................................. DONE
Installed lmenezes/elasticsearch-kopf into /usr/local/elasticsearch/plugins/kopf
安装插件时报错,可能是网络问题,比如网速慢
解决办法:手动下载 等同于命令安装
[root@localhost1 bin]# cd /usr/local/elasticsearch/plugins/
[root@localhost1 plugins]#
wget https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip
[root@localhost1 plugins]# unzip master.zip
[root@localhost1 plugins]# mv elasticsearch-kopf-master kopf
浏览器访问kopf页面访问elasticsearch保存的数据
[root@localhost1 ~]# netstat -tnlp |grep java
tcp 0 0 192.168.8.10:9200 0.0.0.0:* LISTEN 2914/java
tcp 0 0 192.168.8.10:9300 0.0.0.0:* LISTEN 2914/java
tcp 0 0 0.0.0.0:9301 0.0.0.0:* LISTEN 2988/java
http://192.168.8.10:9200/_plugin/kopf
安装head插件
[root@localhost1 bin]# pwd
/usr/local/elasticsearch/bin
[root@localhost1 bin]# ./plugin install mobz/elasticsearch-head
-> Installing mobz/elasticsearch-head...
Trying https://github.com/mobz/elasticsearch-head/archive/master.zip...
Downloading .............................................................................. DONE
Installed mobz/elasticsearch-kopf into /usr/local/elasticsearch/plugins/head
利用这个插件和elasticsearch进行交互
http://192.168.8.20:9200/_plugin/head/
写数据:点击复合查询,输入一下,创建一个索引,提交
复制ID
做一下操作,然后提交
删除的话就把 GET换为delete即可
基本查询
索引 类型 ID 内容:
Elasticsearch是可支持一个分布式的集群,可以有多个节点,在配置文件中进行配置
配置项为cluster.name: 必须一样 将组播发现改为单播,因为组播可能无法发现节点
配置node.name: 不能相同 discovery.zen.ping.multicast.enabled: false默认为Ture
配置network.host: 0.0.0.0 discovery.zen.ping.unicast.hosts: [“IP,IP,IP”]写为所有节点IP地址
配置完后会再一下显示所有节点
01234为分片
一个索引默认分为5个分片 (可以调)
有主分片和副本分片之分,以保证分片冗余
安装bigdesk插件
[root@localhost1 bin]# pwd
/usr/local/elasticsearch/bin
[root@localhost1 bin]# ./plugin install Lukas-vlcek/bigdesk
这里是监控
点击nodes
Bigdesk做监控比较好 但是不支持elasticsearch1.4以上版本
把所有使用的详情都会以图像化显示出来
配置Logstash
Elasticsearch结合logstash
将logstash的信息输出到elasticearch中
[root@localhost1 ~]# vim logstash-elasticsearch.conf
input { stdin {} }
output {
elasticsearch { host => "192.168.8.10" }
stdout { codec=> rubydebug }
}
这个文件的大意就是输出到屏幕终端一份然后传给elasticsearch一份
基于配置文件启动logstash
[root@localhost1 ~]# /usr/local/logstash/bin/logstash agent -f logstash-elasticsearch.conf
七月 22, 2017 4:49:27 上午 org.elasticsearch.node.internal.InternalNode
信息: [logstash-localhost1-2988-11622] version[1.7.0], pid[2988], build[929b973/2015-07-16T14:31:07Z]
七月 22, 2017 4:49:27 上午 org.elasticsearch.node.internal.InternalNode
······
Logstash startup completed
goodmood
{
"message" => "goodmood",
"@version" => "1",
"@timestamp" => "2017-07-21T20:50:28.194Z",
"host" => "localhost1"
}
一用Curl工具发送请求查看elasticsearch是否接收到数据
[root@localhost1 ~]# curl http://192.168.8.10:9200/_search?pretty
{
"took" : 39,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [ {
"_index" : "logstash-2017.07.21",
"_type" : "logs",
"_id" : "AV1m6nc8jvPYTY2JUDWc",
"_score" : 1.0,
"_source":{"message":"goodmood","@version":"1","@timestamp":"2017-07-21T20:50:28.194Z","host":"localhost1"} #因为之前测试过一次,所以显示两个
}, {
"_index" : "logstash-2017.07.21",
"_type" : "logs",
"_id" : "AV1m5vx5BcsontdhE6Va",
"_score" : 1.0,
"_source":{"message":"goodmood","@version":"1","@timestamp":"2017-07-21T20:46:39.739Z","host":"localhost1"}
} ]
}
}
二使用安装好的插件进行查看
多创建一些,此时elasticsearch里就有很多数据,如下
Logstash配置语法
官方文档
中文文档
语法
Logstash 设计了自己的 DSL —— 有点像 Puppet 的 DSL,或许因为都是用 Ruby 语言写的吧 —— 包括有区域,注释,数据类型(布尔值,字符串,数值,数组,哈希),条件判断,字段引用等。
区段(section)
Logstash 用 {} 来定义区域。区域内可以包括插件区域定义,你可以在一个区域内定义多个插件。插件区域内则可以定义键值对设置。示例如下:
input {
stdin {}
syslog {}
}
数据类型
Logstash 支持少量的数据值类型:
bool
debug => true
string
host => "hostname"
number
port => 514
array
match => ["datetime", "UNIX", "ISO8601"]
hash
options => {
key1 => "value1",
key2 => "value2"
}
注意:如果你用的版本低于 1.2.0,哈希的语法跟数组是一样的,像下面这样写:
match => [ "field1", "pattern1", "field2", "pattern2" ]
命令行参数
Logstash 提供了一个 shell 脚本叫 logstash 方便快速运行。它支持一下参数:
· -e
意即执行。我们在 "Hello World" 的时候已经用过这个参数了。事实上你可以不写任何具体配置,直接运行 bin/logstash -e '' 达到相同效果。这个参数的默认值是下面这样:
input {
stdin { }
}
output {
stdout { }
}
· --config 或 -f
意即文件。真实运用中,我们会写很长的配置,甚至可能超过 shell 所能支持的 1024 个字符长度。所以我们必把配置固化到文件里,然后通过 bin/logstash -f agent.conf 这样的形式来运行。
此外,logstash 还提供一个方便我们规划和书写配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 来运行。logstash 会自动读取 /etc/logstash.d/ 目录下所有的文本文件,然后在自己内存里拼接成一个完整的大配置文件,再去执行。
· --configtest 或 -t
意即测试。用来测试 Logstash 读取到的配置文件语法是否能正常解析。Logstash 配置语法是用 grammar.treetop 定义的。尤其是使用了上一条提到的读取目录方式的读者,尤其要提前测试。
· --log 或 -l
意即日志。Logstash 默认输出日志到标准错误。生产环境下你可以通过 bin/logstash -l logs/logstash.log命令来统一存储日志。
· --filterworkers 或 -w
意即工作线程。Logstash 会运行多个线程。你可以用 bin/logstash -w 5 这样的方式强制 Logstash 为过滤插件运行 5 个线程。
注意:Logstash目前还不支持输入插件的多线程。而输出插件的多线程需要在配置内部设置,这个命令行参数只是用来设置过滤插件的!
提示:Logstash 目前不支持对过滤器线程的监测管理。如果 filterworker 挂掉,Logstash 会处于一个无 filter 的僵死状态。这种情况在使用 filter/ruby 自己写代码时非常需要注意,很容易碰上 NoMethodError: undefined method '*' for nil:NilClass 错误。需要妥善处理,提前判断。
· --pluginpath 或 -P
可以写自己的插件,然后用 bin/logstash --pluginpath /path/to/own/plugins 加载它们。
· --verbose
输出一定的调试日志。
:如果你使用的 Logstash 版本低于 1.3.0,你只能用 bin/logstash -v 来代替。
· --debug
输出更多的调试日志。
:如果你使用的 Logstash 版本低于 1.3.0,你只能用 bin/logstash -vv 来代替。
数据从哪里来
input { #输入 支持很多不同的输入
file { #定义输入文件
path => "/var/log/messages" #文件路径
type => "syslog" #标签
start_position => "beginning" 从文件头部开始加载
}
file {
path => "/usr/local/tomcat/logs/*.log"
type => "tomcat"
}
}
路径格式可为以下格式
path => [ "/var/log/messages","/var/log/*.log" ] #数组形式,统配形式*.log
输出到elasticsearch
output {
elasticsearch {
host => "192.168.8.10"
index => "tomcat-access" #索引名
}
}
input {
file {
#监听文件的路径
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
#排除不想监听的文件
exclude => "1.log"
#添加自定义的字段
add_field => {"test"=>"test"}
#增加标签
tags => "tag1"
#设置新事件的标志
delimiter => " "
#设置多长时间扫描目录,发现新文件
discover_interval => 15
#设置多长时间检测文件是否修改
stat_interval => 1
#监听文件的起始位置,默认是end
start_position => beginning
#监听文件读取信息记录的位置
sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
#设置多长时间会写入读取的位置信息
sincedb_write_interval => 15
}
}
filter {
}
output {
stdout {}
}
监控Tomcat(同步旧数据)
input {
file {
path => "/usr/local/tomcat/logs/*.txt"
type => "tomcat-access-txt"
start_position => "beginning"
}
file {
path => "/usr/local/tomcat/logs/*.log"
type => "tomcat-access-log"
start_position => "beginning"
}
file {
path => "/usr/local/tomcat/logs/catalina.out"
type => "tomcat-access-log"
start_position => "beginning"
}
}
output {
elasticsearch {
host => "192.168.8.10"
index => "tomcat-log"
}
}
实时监控Tomcat
input {
file {
path => "/usr/local/tomcat/logs/*.txt"
type => "tomcat-access-txt"
start_position => "end"
}
file {
path => "/usr/local/tomcat/logs/*.log"
type => "tomcat-access-log"
start_position => "end"
}
file {
path => "/usr/local/tomcat/logs/catalina.out"
type => "tomcat-access-log"
start_position => "end"
}
}
output {
elasticsearch {
host => "192.168.8.10"
index => "tomcat-log"
}
}
其中值得注意的是:
1 path
是必须的选项,每一个file配置,都至少有一个path
2 exclude
是不想监听的文件,logstash会自动忽略该文件的监听。配置的规则与path类似,支持字符串或者数组,但是要求必须是绝对路径。
3 start_position
是监听的位置,默认是end,即一个文件如果没有记录它的读取信息,则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,这个配置也就失去作用了。
4 sincedb_path
这个选项配置了默认的读取文件信息记录在哪个文件中,默认是按照文件的inode等信息自动生成。其中记录了inode、主设备号、次设备号以及读取的位置。因此,如果一个文件仅仅是重命名,那么它的inode以及其他信息就不会改变,因此也不会重新读取文件的任何信息。类似的,如果复制了一个文件,就相当于创建了一个新的inode,如果监听的是一个目录,就会读取该文件的所有信息。
5其他的关于扫描和检测的时间,按照默认的来就好了,如果频繁创建新的文件,想要快速监听,那么可以考虑缩短检测的时间。
6 add_field
就是增加一个字段,例如:
file {
add_field => {"test"=>"test"}
path => "D:/tools/logstash/path/to/groksample.log"
start_position => beginning
}
7 tags
用于增加一些标签,这个标签可能在后续的处理中起到标志的作用
8 delimiter
是事件分行的标志,如果配置成123,那么就会如下所示。这个选项,通常在多行事件中比较有用。
Kinaba
安装
wget https://download.elastic.co/kibana/kibana/kibana-4.1.2-linux-x64.tar.gz
[root@localhost1 ~]# tar zxf kibana-4.1.2-linux-x64.tar.gz
[root@localhost1 ~]# mv kibana-4.1.2-linux-x64 /usr/local/kibana
[root@localhost1 ~]# cd /usr/local/kibana/
[root@localhost1 kibana]# cp config/kibana.yml{,.bak}
[root@localhost1 kibana]# vim config/kibana.yml
8 elasticsearch_url: "http://192.168.8.10:9200"
改为具体IP地址
启动
[root@localhost1 ~]# /usr/local/kibana/bin/kibana #输出以下信息表上启动成功
{"name":"Kibana","hostname":"localhost1","pid":3205,"level":30,"msg":"No existing kibana index found","time":"2017-07-21T21:29:28.704Z","v":0}
{"name":"Kibana","hostname":"localhost1","pid":3205,"level":30,"msg":"Listening on 0.0.0.0:5601","time":"2017-07-21T21:29:28.712Z","v":0}
Kinaba默认监听本地的5601端口
浏览器访问Kinaba
使用默认的logstash-*的索引名称,并且是基于时间的,点击“Create”即可。
下图为创建完成
点击Discover可看到导入的日志
如果elasticsearch上面有多个索引
在kibana上切换如下、addnew-----添加新索引名字后面加个*,点击create创建OK
Tomcat日志格式
prefix="goodmood_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D "%{Referer}i" "%{User-Agent}i"" />
最后或:
pattern="common" resolveHosts="false"/>
%h表示访问来源的主机名或者IP地址;
%l表示客户端的标示,通常是 -;
%u表示得到了授权的访问者标示,通常都是 -;
%t表示日志事件的发生时间戳,用 [ 和 ] 括起来的;
"%r"表示用双引号"括起来的访问命令和链接,比如“GET /resource/logo.png”;
%s表示HTTP状态码,如200和404等;
%b是服务器返回的数据量,以字节为单位;
%D表示服务器的响应时间,可以用于分析页面的执行效率;
"%{Referer}i"表示用两个双引号括起来的网址,用于告诉服务器这个访问请求是从哪个页面链接过来的;
"%{User-Agent}i"表示用双引号括起来的浏览器的HTTP代理信息,可以得到客户端使用了什么浏览器内核。
安装Filebeat
Filebeat是一个开源的文件收集器,主要用于获取日志文件,并把它们发送到logstash或elasticsearch。
filebeat最初是基于logstash-forwarder源码的日志数据shipper。Filebeat安装在服务器上作为代理来监视日志目录或特定的日志文件,要么将日志转发到Logstash进行解析,要么直接发送到Elasticsearch进行索引。
还有: