一. 概述
在线上问题排查时,通过日志来定位是经常使用的手段之一,甚至是最有效的。
线上服务为了实现高可用往往采用多节点部署,又或者随着项目愈发复杂会考虑微服务架构,导致日志分散在不同的服务器上,导致排查一个问题,需要登录多台服务器,查询在其上的日志,非常繁琐且低效。
所以,此时我们需要一个统一的实时【日志服务】,将我们需要的日志全部收集在一起,并提供灵活的查询功能。一般来说,一个完整的日志服务,需要提供如下 5 个功能:
- 1、收集 :能够采集多个来源的日志数据。
- 2、传输 :能够稳定的把日志数据传输到日志服务。
- 3、存储 :能够存储海量的日志数据。
- 4、查询 :能够灵活且高效的查询日志数据,并提供一定的分析能力。
- 5、告警 :能够提供提供告警功能,通知开发和运维等等。
二.安装
在centos7.6环境下安装。
1.资源下载
本文使用elk版本为7.5.1,elk三个产品均可以在官网下载。www.elastic.co/cn/download…
官网下载速度偏慢,本人使用华为的镜像站:mirrors.huaweicloud.com
elasticsearch:repo.huaweicloud.com/elasticsear…
logstash: repo.huaweicloud.com/logstash/7.…
2.开始安装
2.1 安装jdk
yum -y install java-1.8.0-openjdk.x86_64
2.2 安装elasticsearch
- 修改 /etc/security/limits.conf ,在此配置中增加以下内容
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
- 修改完成后同时使用命令修改配置
$ ulimit -n 65536
检查是否设置正确
$ ulimit -n
65536
- 修改 /etc/sysctl.conf ,增加如下内容
vm.max_map_count=655360
修改完成后,执行命令使配置生效
$ sysctl -p
- 配置
- 解压
tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz
- 编辑配置
$ vi config/elasticsearch.yml
修改以下配置
network.host: 0.0.0.0 #实现内网可访问
node.name: node-1 # 设置节点名称
cluster.initial_master_nodes: ["node-1"] # 设置主节点
# 下列设置密码服务
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
- 启动
elasticsearch不能使用root账号启动,所以需要创建账号来启动elasticsearch
#linux创建新用户
$ adduser elk
#给新建用户elk设置密码
passwd elk
#给新建用户elk对应权限
$ chown -R elk /opt/elasticsearch-7.5.1
切换到新建用户下,执行启动命令
$ su elk
# 启动。通过 -d 参数,表示后台运行。
$ bin/elasticsearch -d
- 设置密码
$ bin/elasticsearch-setup-passwords interactive
记住elastic密码。登录使用
- 访问 http://服务器IP:9200后,会弹出账号密码输入框,用户名:elastic。密码:刚刚设置的密码。输入后返回如下 JSON 串,表示成功。
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "j-YinjvOStidFGkAgnclCA",
"version" : {
"number" : "7.5.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
"build_date" : "2019-12-16T22:57:37.835892Z",
"build_snapshot" : false,
"lucene_version" : "8.3.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
如果访问不成功,查看是否关闭防火墙
#查看防火墙状态
$ firewall-cmd --state
#关闭停止firewall
$ systemctl stop firewalld.service
禁止防火墙开机启动
$ systemctl disable firewalld.service
2.3 安装kibana
- 解压
$ tar -zxvf kibana-7.5.1-linux-x86_64.tar.gz
- 设置
进去kibana配置文件夹
$ cd kibana-7.5.1/config/
编辑kibana.yml配置文件 vim kibana.yml 输入如下信息
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "${在设置es密码时输入的密码}"
- 启动
# kibana不能用root账户启动,切换到elk用户。
# 赋予权限
$ chown -R elk /opt/kibana-7.5.1-linux-x86_64
# 切换用户
$ su elk
# 执行命令,后台启动 Kibana 服务。
$ nohup bin/kibana &
# 可以通过 nohup.out 日志,查看启动是否成功
- 访问 服务器IP:5601,出现用户名和密码
用户名:elastic
密码:${设置的密码}
- 成功后,即可访问到kibana页面
2.4 安装logstash
- 解压
$ tar -zxvf logstash-7.5.1.tar.gz
- 配置
# 进入目录
$ cd logstash-7.5.1/config
# 设置配置文件
$ vi logstash-sample.conf
配置文件为如下格式
# Sample Logstash configuration for creating a simple
# tcp -> Logstash -> Elasticsearch pipeline.
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "springboot-logstash-%{+YYYY.MM.dd}"
user => "elastic"
password => "${设置的elastic密码}"
}
}
- 启动
$ nohup bin/logstash -f config/logstash-sample.conf &
至此,elk搭建完成。下面介绍如何在Spring boot项目中将日志输出到elk
三.使用
1.Spring boot设置
1.1 新建logback-spring.xml文件,配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--应用名称-->
<springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${logstash服务器ip}:4560</destination>
<!-- encoder必须配置,有多种可选 -->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"logLevel": "%level",
"serviceName": "${APP_NAME}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
<connectionStrategy>
<roundRobin>
<!-- 轮询时间间隔-->
<connectionTTL>5 minutes</connectionTTL>
</roundRobin>
</connectionStrategy>
</appender>
<logger name="com.alibaba.nacos.client.config.impl" level="OFF"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
1.2 加入依赖
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.4</version>
</dependency>
1.3 启动spring boot 服务
2.elk设置
2.1 选择左侧顶部discover
- 然后在中间输入框中输入匹配,一般是日期前面的字符串,加上“*”,这个和logstash配置文件里面的。
springboot-logstash-*
- 点击下一步,选择“timestamp”
3.之后点击创建索引模式
4.之后再次访问discover即可
end