ELK平台搭建
系统环境
System: Centos release 6.7 (Final)
ElasticSearch: 2.3.3
Logstash: 2.1.1
Kibana: 4.3.0
Java: openjdk version "1.8.0_65"
################################################ 下载:Elasticsearch
https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.1.0/elasticsearch-2.1.0.tar.gz
E
elasticsearch
============elasticsearch 安装
cd /usr/local
mkdir elk ### 把安装包上传到这个目录
tar -zxvf elasticsearch-2.1.0.tar.gz
cd elasticsearch-2.1.0
mv elasticsearch-2.1.0 elasticsearch
可视化ela-head组件安装
cd elasticsearch
./bin/plugin install mobz/elasticsearch-head
Paramedic工具
es监控插件
./bin/plugin install karmi/elasticsearch-paramedic
查询 Elasticsearch 中的数据工具 同ela-head
./bin/plugin install lmenezes/elasticsearch-kopf
vim config/elasticsearch.yml
-----------------修改配置文件
cluster.name
: es_cluster
node.name
: node0
path.data: /tmp/elasticsearch/data
path.logs: /tmp/elasticsearch/logs
#当前hostname或IP,我这里是centos2 #原文博客说的 host或者ip,但是我写本机的ip的话,除了服务器本机可以正常访问9200以外,其他电脑无法访问,网上说改成0.0.0.0,试了好用。
network.host: 0.0.0.0
network.port: 9200
这时候执行 ./bin/elasticsearch 报错
![](https://i-blog.csdnimg.cn/blog_migrate/b8457d6eb81e066288b2bf772db74b2a.png)
查看错误信息,大概说是,不能以root用户的身份执行,那好吧。。添加用户,分配权限
----------------新增elsearch用户和组`
创建elsearch用户组及elsearch用户
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
passwd 设置密码 这里是123456
更改elasticsearch文件夹及内部文件的所属用户及组为elsearch:elsearch
chown -R elsearch:elsearch elasticsearch
-------------切换到新用户
su elsearch
123456
--------------运行
./bin/elasticsearch & 或
./bin/elasticsearch -d
这时候会报错如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6d5cca83a6bfafa4c827f3b1e4afb09d.png)
好吧。目测是
elasticsearch.yml里的data和log的目录权限没有给elsearch,那么接着。。
首先 切换到root用户,
su root
123456
然后增加文件夹的权限chown -R elsearch:elsearch /tmp/elasticsearc
然后再切换到elsearch用户
执行 ./bin/elasticsearch 然后访问 ip:9200 ,访问ok
![](https://i-blog.csdnimg.cn/blog_migrate/fe33c548e67b9f6d1d3665c384541f11.png)
这里有一点需要说明:执行
./bin/elasticsearch 之后,你会发现压根退不出去有没有。。
![](https://i-blog.csdnimg.cn/blog_migrate/4644c21f489171188a0e2717d36668ab.png)
其实 :这就是
./bin/elasticsearch 和 ./bin/elasticsearch -d 的区别,执行./bin/elasticsearch -d,你会发现,命名窗口是不输出 东西的
![](https://i-blog.csdnimg.cn/blog_migrate/9e8be1930c92a60e241e78a53690e098.png)
由此。其实我开启了
两个elasticsearch
netstat -tnlp
![](https://i-blog.csdnimg.cn/blog_migrate/aff88338e47027dcef383cf39379e5e7.png)
这时候需要 kill -9 PID 杀掉多余的,一般是保留 9200
重点:
ElasticSearch安装ik分词插件
IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
注意:
ik分词插件的版本与ElasticSearch的版本是有对应关系的,笔者第一次安装用的是ElasticSearch
2.1.0 ,IK 1.9.1 结果报错,大概的意思1.9.1是在
ElasticSearch
2.3.1的版本上开发的,需要下载匹配版本,所以后来我把版本换成了
ElasticSearch
2.3.3,IK 1.9.3,可以查看地址
https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v1.10.0
,这里有完整的对应关系。
关于IK的安装,笔者主要是对照git的安装步骤说明来的,官网的步骤是:
通过git clone https://github.com/medcl/elasticsearch-analysis-ik,下载分词器源码,然后进入下载目录,执行命令:mvn clean package 打包生成 zip包,zip包的生成u目录是
target/releases/elasticsearch-analysis-ik-{version}.zip ,然后再
elasticsearch的
plugins下新建ik文件夹,将 target/releases/elasticsearch-analysis-ik-{version}.zip 拷贝被
elasticsearch/
plugins/ik 目录下,执行unzip 解压缩即可。
推荐:笔者发现了一个简单的方式,不需要安装maven 执行打包的过程,直接到
https://github.com/medcl/elasticsearch-analysis-ik/releases
找对应版本的zip文件,然后上传即可。
另外:按理说 ik组件的 安装也可以 参照
ela-head组件的安装方式安装,
![](https://i-blog.csdnimg.cn/blog_migrate/0b7d2d4363381e17c05e2fc07bd854df.png)
./bin/plugin install
mobz/elasticsearch-head
红色部分与 红框对应,但是报错,
![](https://i-blog.csdnimg.cn/blog_migrate/6de81acb5d6dcd2b0f2dc152a84a498f.png)
plugin-descriptor.properties 找不到。。。所以这种方式pass了,但是要会看。
ctrl z 暂停当前切换到控制
bg 后台执行
fg 前台
Logstash
关于这部分请先查看:【转】Logstash的安装部署 文章,其实主要还是参照了上面的博客。
我的实际配置Logstash:
tar -zxvf logstash-2.1.1.tar.gzcd logstash-2.1.1
编写配置文件(名字和位置可以随意,这里我放在config目录下,取名为log4j_to_es.conf):
mkdir configvi config/log4j_to_es.conf
# Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input { redis{ host =>
"127.0.0.1"
port => 6379 type =>
"weds-pay-api"
data_type =>
"list"
key =>
"weds-pay-api"
} }
filter
{ date { match => [
"addtime"
,
"yyyy-MM-dd HH:mm:ss"
] target =>
"@timestamp"
}}output{ stdout { codec => rubydebug } elasticsearch { index =>
"%{type}-%{+YYYY.MM}"
hosts =>
"192.168.30.129:9200"
workers => 5 }}
启动方式:
./bin/logstash agent -f config/log4j_to_es.conf &
加了&是后台启动,不加是直接启动
解释:配置连接reids,项目程序将请求的日志信息写入到redis,然后
logstash监听redis的list,redis里list的key为
weds-pay-api,
logstash会监听redis的list,当发现数据以后就会批量的通过logstash写入到elasticsearch。
附java代码的实现
重写Appender
package
com.weds.framework.utils.elk;
import
java.util.Map;
import
java.util.concurrent.CompletableFuture;
import
org.apache.log4j.AppenderSkeleton;
import
org.apache.log4j.spi.LocationInfo;
import
org.apache.log4j.spi.LoggingEvent;
import
com.weds.framework.core.utils.JsonUtil;
import
com.weds.framework.core.utils.redis.RedisService;
/** * * <p>Title: ApiAppender</p> * <p>Description: 重写Appender 调用log4就时,将记录存入redis</p> * <p>Company: Leyou(China) Chain Store Co.,Ltd</p> * <p>版权所有: Copyright?1999-2016 leyou.com. All Rights Reserved</p> *
@author
Illidan * @date 2016年5月19日 上午10:25:59 *
@version
V1.0 */
public
class
ApiAppender
extends
AppenderSkeleton{
/** * Jredis连接redis的client */
private
RedisService redisService;
/** * 记录接口方法调用次数日志需要先写入redis中,redis的key不能为空,这个key需要同步在logstash配置文件中配置 */
private
String writeLogKey; @Override
public
void
close() {
// TODO Auto-generated method stub
} @Override
public
boolean
requiresLayout() {
// TODO Auto-generated method stub
return
false
; }
/** * 重写日志输出输出 */
@Override
protected
void
append(LoggingEvent event) { LocationInfo locationInfo = event.getLocationInformation(); Map<String,Object> map =(Map<String,Object>)event.getMessage(); map.put("levl", event.getLevel().toString()); writeLogAsync(writeLogKey,map); }
/** * 异步记录日志 *
@param
key 记录到redis的中key,key需要同步在logstash配置文件中配置 *
@param
value 日志的值,Map格式 */
public
void
writeLogAsync(String key,Map<String,Object> map){ CompletableFuture.runAsync(() -> { writeLog(key,map); }); }
/** * * @Title: writeLogAsync * @Description: 异步存储日志 *
@param
*
@return
void 返回类型 *
@throws
*
@author
Illidan * @date 2016年5月18日 下午1:51:56 */
public
void
writeLogAsync(String key,String value){ CompletableFuture.runAsync(() -> { writeLog(key,value); }); }
/** *记录日志到redis的List集合中,值为Map集合方式 *
@param
key 记录redis的key,key需要同步在logstash配置文件中配置 *
@param
map value为Map值 */
public
void
writeLog(String key,Map<String,Object> map){ String value = JsonUtil.obj2string(map); writeLog(key, value); }
/** * 记录日志到redis的List集合中 *
@param
key 记录redis的key,key需要同步在logstash配置文件中配置 *
@param
value 记录的值 */
public
void
writeLog(String key, String value) {
if
(key !=
null
){ redisService =(RedisService)SpringContextUtil.getBean("redisService",RedisService.
class
); redisService.setList(key, value); } }
public
RedisService getRedisService() {
return
redisService; }
public
void
setRedisService(RedisService redisService) {
this
.redisService = redisService; }
public
String getWriteLogKey() {
return
writeLogKey; }
public
void
setWriteLogKey(String writeLogKey) {
this
.writeLogKey = writeLogKey; }}
log4j.properties 增加配置:
log4j.logger.weds-pay-Log=INFO,aip log4j.appender.aip=com.weds.framework.utils.elk.ApiAppender log4j.appender.aip.writeLogKey=
weds-pay-api
log4j.appender.aip.layout=org.apache.log4j.PatternLayoutlog4j.appender.aip.layout.ConversionPattern=%d %p [%c] - %m%n
注意:这里
log4j_to_es.conf 中 redis的key 与
log4j.properties 的
log4j.appender.aip.writeLogKey以及ApiAppender 的writeLogKey 属性有对象关系。
java代码的使用
protected
static
final
Logger log = Logger.getLogger("weds-pay-Log"); log.info(map);
//记录日志到 elk日志中心
注意:这里的
weds-pay-Log与
log4j.properties的
log4j.logger.weds-pay-Log是有关系的。
Kibana
这部分基本的参照文章顶部的连接即可:
===========================安装kibana
tar -zxvf kibana-4.3.0-linux-x86.tar.gz
cd kibana-4.3.0-linux-x86
vim config/kibana.yml
-------修改配置
server.port: 5601
server.host: "192.168.30.129"
elasticsearch.url: "http://192.168.30.129:9200"
kibana.index: ".kibana"
-------运行
./bin/kibana &
加了&是后台启动,不加是直接启动