一、ELK 是什么?
“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。
Elasticsearch:是一个搜索和分析引擎。
Logstash:是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。
Kibana:则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,我们引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。
二、ELK环境
2.1、软件版本
软件 | 版本 |
CentOS | 7.8 |
JDK | Elasticsearch自带 |
Elasticsearch | 7.9.2 |
Kibana | 7.9.2 |
Logstash | 7.9.2 |
2.2、软件下载
CentOS:http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso
Elasticsearch、Kibana、Logstash:https://elasticsearch.cn/download/
Elasticsearch、Kibana、Logstash国内镜像地址:https://mirrors.huaweicloud.com/elasticsearch/
我们在根目录下创建software文件夹,把软件放到software文件夹。
[root@localhost ~]# mkdir /software/
三、ELK安装部署
3.1、安装Elasticsearch
1、解压elasticsearch
[root@localhost software]# tar -zxvf elasticsearch-7.9.2-linux-x86_64.tar.gz -C /usr/local/
2、修改elasticsearch.yml 配置文件
[root@localhost software]# cd /usr/local/elasticsearch-7.9.2/
[root@localhost elasticsearch-7.9.2]# vi config/elasticsearch.yml
# 修改以下几项
node.name: node-1 # 设置节点名称
network.host: 0.0.0.0 # 允许所有ip访问
cluster.initial_master_nodes: ["node-1"] #设置集群初始主节点
配置参数官方文档地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html
3、修改elasticsearch配置
在启动elasticsearch前,我们需要修改一下系统配置,否则启动会报错以下错误:
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch-7.9.2/logs/
elasticsearch.log
(1)修改limits.conf文件
[root@localhost elasticsearch-7.9.2]# vim /etc/security/limits.conf
在limits.conf文件末尾添加
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
配置完成后,断开重新连接一下,配置才会生效。
(2)修改sysctl.conf文件
[root@localhost elasticsearch-7.9.2]# vim /etc/sysctl.conf
在sysctl.conf文件后面添加
vm.max_map_count=655360
刷新配置文件使之生效
[root@localhost elasticsearch-7.9.2]# sysctl -p
vm.max_map_count = 655360
系统参数官方文档地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html
4、关闭防火墙
我们一般都是把elasticsearch装在虚拟机里,在外部访问,为了方便我们把防火墙关闭,并且禁止开机启动。
[root@localhost elasticsearch-7.9.2]# firewall-cmd --state
running
[root@localhost elasticsearch-7.9.2]# systemctl stop firewalld.service
[root@localhost elasticsearch-7.9.2]# firewall-cmd --state
not running
[root@localhost elasticsearch-7.9.2]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
5、ik分词器安装(不需要可以跳过)
IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
我们把解压好的ik分词器文件夹重命名为analysis-ik-7.9.2,并放到plugins文件夹里面,启动elasticsearch后,ik分词器就会生效。
[root@localhost ~]# cd /software/
[root@localhost software]# wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/
v7.9.2/elasticsearch-analysis-ik-7.9.2.zip
[root@localhost software]# unzip elasticsearch-analysis-ik-7.9.2.zip -d analysis-ik-7.9.2
[root@localhost software]# mv analysis-ik-7.9.2/ /usr/local/elasticsearch-7.9.2/plugins/
[root@localhost software]# ll /usr/local/elasticsearch-7.9.2/plugins/
总用量 0
drwxr-xr-x. 3 root root 243 10月 27 00:42 analysis-ik-7.9.2
6、配置elasticsearch启动用户
Elasticsearch为了安全考虑不允许使用root用户启动Elasticsearch,所以我们需要新建一个普通用户启动程序。新建的用户名和密码都是elastic。
[root@localhost elasticsearch-7.9.2]# adduser elastic
[root@localhost elasticsearch-7.9.2]# passwd elastic
更改用户 elastic 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
使用passwd elastic 命令给elastic用户设置密码(需要输入两遍密码)时,如果密码过于简单会有提示,用 root 用户操作可忽略提示,继续输入第二遍密码强制设置密码。
将elasticsearch目录权限赋予elastic用户,并用elastic用户启动elasticsearch,启动参数后面-d表示后台启动。
[root@localhost elasticsearch-7.9.2]# chown -R elastic /usr/local/elasticsearch-7.9.2/
[root@localhost elasticsearch-7.9.2]# su elastic
[elastic@localhost elasticsearch-7.9.2]$ ./bin/elasticsearch -d
如果使用root用户启动,会有以下报错信息
[root@localhost elasticsearch-7.9.2]# ./bin/elasticsearch
[2020-10-27T00:01:56,296][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:174) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127) ~[elasticsearch-cli-7.9.2.jar:7.9.2]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.9.2.jar:7.9.2]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.9.2.jar:7.9.2]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:111) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:178) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:393) ~[elasticsearch-7.9.2.jar:7.9.2]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) ~[elasticsearch-7.9.2.jar:7.9.2]
... 6 more
uncaught exception in thread [main]
java.lang.RuntimeException: can not run elasticsearch as root
root用户无法启动官方说明:
7、验证 elasticsearch 是否启动成
安装elasticsearch的ip为192.168.19.12,elasticsearch 的默认端口号是9200,我们直接在浏览器中输入192.168.19.12:9200,如果返回以下信息,说明elasticsearch启动成功。
8、重启和关闭elasticsearch
elasticsearch启动后,没有命令可以优雅关闭,目前只能使用ps -ef | grep elasticsearch 查找elasticsearch进行,然后使用kill命令直接结束进程。
[root@localhost elasticsearch-7.9.2]# jps
73138 Jps
59027 Elasticsearch
[elastic@localhost elasticsearch-7.9.2]$ kill -9 59027
3.2、安装Kibana
1、解压kibana
我们把kibana直接解压到/usr/local/里面,重命名文件夹kibana-7.9.2
[root@localhost ~]# cd /software/
[root@localhost software]# tar -zxvf kibana-7.9.2-linux-x86_64.tar.gz -C /usr/local/
[root@localhost software]# cd /usr/local/
[root@localhost local]# mv kibana-7.9.2-linux-x86_64/ kibana-7.9.2
2、修改 kibana 配置文件
[root@localhost local]# cd kibana-7.9.2/
[root@localhost kibana-7.9.2]# vi config/kibana.yml
修改kibana.yml以下几个地方
# 修改以下几项
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
3、修改目录权限
kibana同样无法用root用户启动,root用户启动会有以下错误提示
[root@localhost kibana-7.9.2]# Kibana should not be run as root. Use --allow-root to continue.
[1]+ 退出 1 ./bin/kibana
[root@localhost kibana-7.9.2]# chown -R elastic /usr/local/kibana-7.9.2/
我们将文件夹权限赋给elastic用户,使用 elastic 用户启动,./bin/kibana & 表示后台启动,启动后会返回进程id
[root@localhost kibana-7.9.2]# chown -R elastic /usr/local/kibana-7.9.2/
[root@localhost kibana-7.9.2]# su elastic
[root@localhost kibana-7.9.2]# ./bin/kibana &
[1] 73823
4、验证kibana
我们直接通过地址访问,虚拟机的ip为192.168.19.12,kibana的访问地址为192.168.19.12:5601。
3.3、安装Logstash
1、安装logstash
我们使用root用户安装logstash,进到/software文件夹,解压logstash-7.9.2.tar.gz到/usr/local/
[elastic@localhost ~]$ su root
密码:
[root@localhost elastic]# cd /software/
[root@localhost software]# tar -zxvf logstash-7.9.2.tar.gz -C /usr/local/
2、修改logstash配置
在logstash的config目录下,有一个logstash-sample.conf文件,这个是官方提供的配置,我们把这个复制一份,重命名为logstash.conf。
[root@localhost local]# cd logstash-7.9.2/
[root@localhost logstash-7.9.2]# ll config/
总用量 44
-rw-r--r--. 1 631 503 2019 9月 23 11:10 jvm.options
-rw-r--r--. 1 631 503 9097 9月 23 11:10 log4j2.properties
-rw-r--r--. 1 631 503 342 9月 23 11:10 logstash-sample.conf
-rw-r--r--. 1 631 503 10661 9月 23 11:10 logstash.yml
-rw-r--r--. 1 631 503 3146 9月 23 11:10 pipelines.yml
-rw-r--r--. 1 631 503 1696 9月 23 11:10 startup.options
[root@localhost logstash-7.9.2]# cp config/logstash-sample.conf config/logstash.conf
[root@localhost logstash-7.9.2]# vi config/logstash.conf
修改 logstash 配置文件,文件修改成如下:
input {
file {
path => ["/app/logs/*.log"]
type => "app"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{type}-log-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
我们这里以文件作为输入流,elasticsearch 作为输出流
input
- path :读取日志文件作为输入流
- type:自定义字段
- start_position:表示文件读取位置
output
- hosts :表示我们把日志输出到elasticsearch。
- index :日志在elasticsearch上建立的索引名称
3、启动logstash
我们使用后台&后台启动logstash,后台进程id会返回
[root@localhost logstash-7.9.2]# nohup ./bin/logstash -f ./config/logstash.conf &
[1] 56810
[root@localhost logstash-7.9.2]# nohup: 忽略输入并把输出追加到"nohup.out"
启动完成后,我们可以使用jps命令验证启动是否成功
[root@localhost elasticsearch-7.9.2]# jps
73138 Jps
59027 Elasticsearch
56810 Logstash
四、搭建Spring boot项目
4.1、新建spring boot项目
我们创建一个spring boot工程,做一个简单的日志输出,项目结构如下:
application.yml配置如下:
spring:
application:
name: elasticsearch
server:
port: 10000
logging:
config: classpath:logback-spring.xml
spring boot默认整合了logback,我们只需要配置一下logback.xml就可以安装配置进行输出了。
logback-spring.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="PATH" value="/app/logs" />
<property name="APP_CODE" value="app" />
<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d:日期、%thread 线程名、%-5level:从左显示5个字符宽度,%msg:日志消息,%n:换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${PATH}/${APP_CODE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d:日期、%thread 线程名、%-5level:从左显示5个字符宽度,%msg:日志消息,%n:换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</configuration>
4.2、运行spring boot项目
我们把项目打成jar放到服务器上,运行
[root@localhost ~]# mkdir /app
[root@localhost ~]# cd /app
[root@localhost app]# nohup java -jar springboot-elasticsearch-0.0.1-SNAPSHOT.jar &
[1] 8291
[root@localhost app]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@localhost app]# ll
总用量 17944
drwxr-xr-x. 2 root root 32 10月 30 13:51 logs
-rw-------. 1 root root 687 10月 30 13:51 nohup.out
-rw-r--r--. 1 root root 18369791 10月 30 13:50 springboot-elasticsearch-0.0.1-SNAPSHOT.jar
[root@localhost app]# ll logs/
总用量 4
-rw-r--r--. 1 root root 1876 10月 30 13:51 app.2020-10-30.log
我们访问一下项目,日志会输出到app.2020-10-30.log文件里面。
五、配置Kibana
我们打开Kibana,按找如下所示进行配置:
选择Create index pattern
在index pattern name里面,我们输入要查询的索引名称,也就是logstash.conf里面配置的index => "%{type}-log-%{+YYYY.MM.dd}",这个索引名称就是app-log-2020.10.30,选择Next step
选择Time field,点击Create index pattern;
在菜单栏里面,我们再次点击Discover,我们会发现日志已经出来了。
我们输入关键字Apple iPhone,发现结果就是这一条