开源实时日志分析 ELK 平台由 ElasticSearch 、 Logstash 和 Kibana 三个开源工具组成。
Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful 风格接口,多数据源,自动搜索负载等。
Logstash 是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,他 Kibana 可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据。
一、Logstash
安装:tar zxvf logstash-1.5.2.tar.gz
运行:./logstash -e 'input { stdin { } } output { stdout {} }'
结果:
Logstash startup completed
Hello World!
2015-07-15T03:28:56.938Z noc.vfast.com Hello World!
退出:Ctrl+C
编辑:vim logstash-simple.conf
input { stdin { } }
output {
stdout { codec=> rubydebug }
}
运行:./logstash agent -f logstash-simple.conf
结果:
Logstash startup completed
hello cpit
{
"message" => "hello cpit",
"@version" => "1",
"@timestamp" => "2017-03-27T08:10:19.586Z",
"host" => "mcs-slave-2"
}
二、Elasticsearch
安装:tar zxvf elasticsearch-1.7.1.tar.gz
启动:./elasticsearch
确认elasticsearch的9200端口已监听:netstat -anp |grep :9200
结果:tcp6 0 0 :::9200 :::* LISTEN 7169/java
三、测试logstash使用elasticsearch作为logstash的后端
编辑:vim logstash-es-simple.conf
input { stdin { } }
output {
elasticsearch {host => "localhost" }
stdout { codec=> rubydebug }
}
执行:./logstash agent -f logstash-es-simple.conf
后台启动:nohup . /elasticsearch &
结果:
Logstash startup completed
hello logstash
{
"message" => "hello logstash",
"@version" => "1",
"@timestamp" => "2015-07-15T18:12:00.450Z",
"host" => "noc.vfast.com"
}
使用curl来查看ES是否接收到了数据:curl 'http://localhost:9200/_search?pretty'
结果:
{
"took" : 47,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "logstash-2017.03.27",
"_type" : "logs",
"_id" : "AVsO1xmUL1RJegwzT5T5",
"_score" : 1.0,
"_source":{"message":"hello logstash","@version":"1","@timestamp":"2017-03-27T08:17:08.889Z","host":"mcs-slave-2"}
} ]
}
}
四、Elasticsearch-kopf插件可以查询Elasticsearch中的数据
安装进入Elasticsearch的安装目录执行:./plugin -install lmenezes/elasticsearch-kopf
安装完成后在plugins目录下可以看到kopf.
#在配置文件elasticsearch.yml里设置script.disable_dynamic: true
在浏览器访问http://10.3.17.237:9200/_plugin/kopf/#!/cluster浏览可以查询保存在Elasticsearch中的数据
五、Kibana
netstat -apn | grep 5601
安装: tar zxvf rashidkpc-kibana-b83dedf.tar.gz
启动:./kibana
使用http://10.3.17.237:5601访问Kibana, 登录后,配置一个索引.
六、配置logstash作为Indexer
编写配置文件:vim logstash-indexer.conf
input {
file {
type =>"syslog"
path => ["/var/log/messages", "/var/log/syslog" ]
}
syslog {
type =>"syslog"
port =>"5544"
}
}
output {
stdout { codec=> rubydebug }
elasticsearch {host => "10.3.17.237" }
}
运行:./logstash agent -f logstash-indexer.conf
使用echo命令模拟写入日志:echo "`date` cpit " >>/var/log/messages
七、elasticsearch集群安装
安装head插件:./plugin install mobz/elasticsearch-head
配置config
cluster.name: es-cluster
node.name: node-1 #不同
network.host: #你的服务器ip地址
http.port: #9211 #不同
transport.tcp.port: #9311 #不同
index.cache.field.expire: 1d #过期时间
index.cache.field.type: soft
#默认类型为resident, 字面意思是常驻(居民), 一直增加,直到内存耗尽。改为soft就是当内存不足的时候,先clear掉占用的,然后再往内存中放。设置为soft后,相当于设置成了相对的内存大小。resident的话,除非内存够大。
discovery.zen.ping.unicast.hosts: ["你的服务器列表(TCP端口)", "你的服务器列表(TCP端口)","你的服务器列表(TCP端口)"]
修改配置文件:log4j_to_es.conf
input {
file {
type => "infolog"
path => "你的日志路径*.log" #监听文件的路径
}
file {
type => "errorlog"
path => "你的日志路径*.log"
}
}
filter {
multiline {
pattern => "^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}"
negate => true
what => "previous"
}
}
output {
if [type] == "infolog" {
elasticsearch {
action => "index" #The operation on ES
hosts => ["elasticsearch的IP地址:9211", "elasticsearch的IP地址:9212","elasticsearch的IP地址:9213"]
index => "apilog_%{+YYYY.MM.dd}"
}
}else{
elasticsearch {
action => "index" #The operation on ES
hosts => ["elasticsearch的IP地址:9211", "elasticsearch的IP地址:9212","elasticsearch的IP地址:9213"]
index => "apierrorlog_%{+YYYY.MM.dd}" }
}
}
直接与log4j配合使用,直接将日志输出到logstash中
log4j.logger.包名=debug, socket
# appender socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=${elk_port}
log4j.appender.socket.RemoteHost=${elk_ip}
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n
log4j.appender.socket.ReconnectionDelay=10000
八、定时清理ES索引数据
编写清理脚本:es-index-clear.sh
LAST_DATA=`date -d '-3 day' +%Y.%m.%d`
echo ”${LAST_DATA} 开始执行删除操作“
curl -XDELETE 'http://10.104.29.19:9211/*'${LAST_DATA}''
echo "${LAST_DATA} 执行完毕。
设置定时任务
输入crontab -e,出现vi编辑页面
输入以下命令,每天两点10分执行sh文件:
10 2 */1 * * /letv/soft/elk/logstash-2.4.1/bin/es-index-clear.sh