参考:
https://my.oschina.net/itblog/blog/547250?p=2&temp=1503478503046#blog-comments-list

head插件安装参考:
https://wenku.baidu.com/view/1c61ece6162ded630b1c59eef8c75fbfc77d94e5.html

说明:测试机器为192.168.74.125.

下载软件

1
2
3
elasticsearch-5.5.0.tar.gz
logstash-5.5.2.tar.gz
kibana-5.5.0-linux-x86_64.tar.gz

下载地址:https://www.elastic.co/downloads
下载速度较慢,可以使用香港网络下载。
软件下载的位置:/data/soft

安装

1、安装并配置JAVA环境变量

1、安装JDK

ES要求JDK版本至少1.8.
从oracle网站下载jdk-8u144-linux-x64.tar.gz。
下载完毕后,使用tar –zxvf jdk-8u144-linux-x64.tar.gz –C /usr/java,将JDK解压到/usr/java。
解压后得到:/usr/java/jdk1.8.0_144

2、配置环境变量

vi /etc/profile,在文件末尾添加:

1
2
3
export JAVA_HOME=/usr/java/jdk1.8.0_144
export CLASSPATH=${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=${PATH}:${JAVA_HOME}/bin

然后:wq保存文件。

然后执行source /etc/profile使环境变量生效。
最后用java –version来验证一下。

安装ElasticSearch

在/data/soft目录,执行tar –zxvf elasticsearch-5.5.0.tar.gz解压缩es。
由于es不能使用root用户运行,所以这里创建用户组bd和用户bd,密码为test123456
步骤如下:

1
2
3
groupadd bd
useradd bd
passwd bd

然后输入密码test123456
然后将/data/soft/elasticsearch-5.5.0的拥有者改为bd。
进入/data/soft,执行sudo chown -R bd:bd ./elasticsearch-5.5.0。

修改es的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd $ES_HOME$/config,vi elasticsearch.yml打开配置文件。
cluster.name: es-cluster
path.data: /tmp/es/data
path.logs: /tmp/es/logs
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

network.host: 0.0.0.0

http.cors.enabled: true
http.cors.allow-origin: "*"

启动es
./bin/elasticsearch &

在浏览器打开:http://192.168.74.125:9200/

如果可以看到上图则es安装成功。

安装head插件

Es5.0的head插件安装还是很麻烦的,具体可以参考:
https://wenku.baidu.com/view/1c61ece6162ded630b1c59eef8c75fbfc77d94e5.html

a. 安装git

1
yum –y install git

安装完毕后,就可以下载Head的源代码了。

1
git clone git://github.com/mobz/elasticsearch-head.git

注:这里我们仍然下载的/data/soft目录。

b. 安装node
由于head插件本质上还是一个nodejs工程,因此需要安装node,使用npm来安装依赖的包。
去官网下载nodejs,https://nodejs.org/en/download/

下载下来的jar包是xz格式的,一般的linux可能不识别,还需要安装xz.

1
yum -y install xz

然后解压nodejs的安装包:

1
2
xz -d node*.tar.xz 
tar -xvf node*.tar -C /user/node

解压完node的安装文件后,需要配置下环境变量,编辑/etc/profile,添加

1
2
export NODE_HOME=/usr/node/node-v6.11.2-linux-x64
export PATH=${PATH}:${NODE_HOME}/bin

别忘记立即执行以下

1
source /etc/profile

这个时候可以测试一下node是否生效:

注意:npm安装插件,经常受网络影响,无法下载
受网络影响建议安装cnpm(淘宝团队建立的中国镜像)

1
npm install cnpm -g --registry=https://registry.npm.taobao.org

c. 安装grunt
grunt是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,5.0里的head插件就是通过grunt启动的。因此需要安装一下grunt。
安装grunt-cli

1
npm install –g grunt-cli

安装完毕后,检查一下:

注意:如果安装报错,到/usr/node/ node-v6.11.2-linux-x64目录执行上述命令。

d. 修改head源码
修改服务器监听地址:
目录:elasticsearch-head/Gruntfile.js

1
2
3
4
5
6
7
8
9
10
11
connect:
{ server:
{ options:
{
port:9100,
hostname: '*',
base: '.',
keepalive:true
}
}
}

增加hostname属性,设置为*

修改连接地址:
目录:elasticsearch-head/_site/app.js
修改head的连接地址:

1
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";

把localhost修改成你es的服务器地址,如:

1
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://10.10.10.10:9200";

e. 运行head插件
首先运行es。
然后在head目录中,执行

1
npm install 下载以来的包

最后,启动nodejs

1
grunt server

这个时候访问192.168.74.125:9100就可以访问Head插件了。

安装logstash

执行tar –zxvf logstash-5.5.2.tar.gz解压缩logstash。
进入config目录,新增log4j_to_es.conf文件。

1
cd /data/soft/logstash-5.5.2/config

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# For detail structure of this file
# Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input {
# For detail config for log4j as input,
# See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
log4j {
mode => "server"
host => "0.0.0.0"
port => 4567
}
}
filter {
#Only matched data are send to output.
}
output {
# For detail config for elasticsearch as output,
# See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
elasticsearch {
action => "index" #The operation on ES
hosts => "192.168.74.125:9200" #ElasticSearch host, can be array.
index => "applog" #The index to write data to.
}
}

这里的配置说明可以参考:https://my.oschina.net/itblog/blog/547250?p=2&temp=1503478503046#blog-comments-list

最后使用./bin/logstash –f ./config/log4j_to_es.conf来启动logstash。

接下来创建一个示例工程,演示使用将log4j日志输出到logstash。
新建一个elk-demo的maven工程,

Maven依赖:

1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

Log4j配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
log4j.rootLogger=INFO,console

# for package com.tommy.elk, log would be sent to socket appender.
log4j.logger.com.tommy.elk=DEBUG, socket

# appender socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=4567
log4j.appender.socket.RemoteHost=192.168.74.125
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n
log4j.appender.socket.ReconnectionDelay=10000

# appender console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%l] %m%n

可以看到log4j中指定了一个appder为socket,配置了远程的host和端口,这个就是上面在logstash中配置的。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Hello world!
*
*/
public class App
{
private static final Logger LOGGER = Logger.getLogger(App.class);
public static void main( String[] args ) throws InterruptedException {
LOGGER.info( "Hello World!" );
for (int i = 0; i < 10; i++) {
LOGGER.error("测试消息 [" + i + "].");
Thread.sleep(500);
}
}
}

运行一下App.java,控制台输出了log4j日志。

我们刷新一下head插件,在索引TAB中可以看到

在数据浏览TAB中可以看到日志信息,点击某一个可以看到详情

安装Kibana

执行tar –zxvf kibana-5.5.0-linux-x86_64.tar.gz解压缩kibana。
然后进入config目录,编辑kibana配置文件

1
2
cd kibana-5.5.0-linux-x86_64
vi ./config/kibana.yml

修改下面几项:

1
2
3
4
server.port: 5601
server.host: “192.168.74.125”
elasticsearch.url: http://192.168.74.125:9200
kibana.index: “.kibana”

然后启动kinaba.

1
./bin/kibana

启动后用浏览器打开http://192.168.74.125:5601/

为了后续使用Kibana,需要配置至少一个Index名字或者Pattern,它用于在分析时确定ES中的Index。这里我输入之前配置的Index名字applog,Kibana会自动加载该Index下doc的field,并自动选择合适的field用于图标中的时间字段:


点击Create后,可以看到左侧增加了配置的Index名字:


可以在上面的输入框中输入内容搜索

常见问题

  1. java.lang.RuntimeException: can not run elasticsearch as root
    使用非root用户执行。
    创建用户组bd
    groupadd bd
    创建用户bd,属组bd
    useradd bd -g bd
    给用户bd设置密码
    passwd bd
    (密码为test123456)

  2. 已经在/etc/profile中修改了环境变量,将java环境变量设置为了1.8,使用source /etc/profile后root用户下已生效。
    但切换到非root用户下,仍然显示的之前的java版本。
    解决:http://blog.csdn.net/newtelcom/article/details/49967919

  3. 启动es时,提示无权限
    java.nio.file.AccessDeniedException: /data/soft/elasticsearch-5.5.0/config/elasticsearch.yml
    解决:
    改变elasticsearch文件夹所有者到当前用户
    sudo chown -R 非root用户组:非root用户 elasticsearch
    比如问题1中添加的用户组bd和用户bd.
    sudo chown -R bd:bd elasticsearch

  4. 提示数据目录或日志目录无权限
    java.nio.file.AccessDeniedException: /tmp/es/data/nodes
    解决:参考3.将/tmp/es目录所有者设置为bd.
    sudo chown -R bd:bd es

  5. seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
    报了一大串错误,其实只是一个警告。
    解决:使用心得linux版本,就不会出现此类问题了。

  6. max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
    max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]
    解决:切换到root用户,编辑limits.conf 添加类似如下内容
    vi /etc/security/limits.conf
    添加如下内容:

    1
    2
    3
    4
    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 2048
    * hard nproc 4096
  7. max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
    解决:切换到root用户,进入limits.d目录下修改配置文件。
    vi /etc/security/limits.d/90-nproc.conf
    修改如下内容:
    * soft nproc 1024
    修改为
    * soft nproc 2048

  8. max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
    解决:切换到root用户修改配置sysctl.conf
    vi /etc/sysctl.conf
    添加下面配置:
    vm.max_map_count=655360
    并执行命令:
    sysctl -p
    然后,重新启动elasticsearch,即可启动成功。

  9. system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
    问题原因:因为Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
    详见 :https://github.com/elastic/elasticsearch/issues/22899
    解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
    bootstrap.memory_lock: false
    bootstrap.system_call_filter: false

  10. 安装head插件后,head插件访问es提示跨域问题。
    解决:
    在$ES_HOME$/config/elasticsearch.yml中增加下面的配置:
    //增加新的参数,这样head插件可以访问es
    http.cors.enabled: true
    http.cors.allow-origin: “*”

  11. logstash5启动方式
    ./bin/logstash -f ./config/log4j_to_es.conf

  12. logstash错误:Cannot assign requested address
    将配置文件中的host改成:0.0.0.0.
    参考:https://stackoverflow.com/questions/30624467/connect-logstash-1-5-0-with-log4j-of-several-servers