elasticsearch-7.3.0,(Jdk8适配8.0以下)
链接: 下载地址
kibana-7.3.0
链接: 下载地址
logstash-7.3.0
链接: 下载地址
logstash-7.3.0
链接: 下载地址
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz
重点:这里必须搞个用户,root用户无法运行的,并且ES自带的环境变量ES_HOME 目录就是该用户的文件目录
groupadd elsearch
useradd elsearch(用户名) -g elsearch(组名) -p elsearch(密码)
chown -R elsearch:elsearch /home/elsearch/elasticsearch-7.3.0
cd /home/elsearch/elasticsearch-7.3.0/config
vim elasticsearch.yml
官方自带的配置文件都是注释的,故我们自行在末尾自行添加一下配置就OK。
# 如果需要部署集群,集群需要同样的集群名
cluster.name: my-es-application
#
# # 每个 node 的名字需要唯一
node.name: node-1
#
# # 注意一定要是路径后面加上/var/lib/elasticsearch/nodes,要不然无法加入集群,单机不需要
# # path.data: /var/lib/elasticsearch/nodes
# # path.logs: /var/log/elasticsearch
#
# # 配置服务器的内网地址,有文档配置的 0.0.0.0 或 localhost,但是后面出现了问题,暂未研究什么原因
network.host: 192.168.1.239
#
# # 配置端口号,默认 9200
http.port: 9200
#
# # 配置集群节点,多个服务器["node-1", "node-2"]
cluster.initial_master_nodes: ["node-1"]
# # 配置集群的主机和端口地址
# # discovery.seed_hosts: ["192.168.0.146", "192.168.0.147", "192.168.0.148"]
#
# # 解决跨域
http.cors.enabled: true
这里是单实例Elasticsearch,如果要搭建集群,请参考
# 刷新环境变量
echo "export ES_HOME=/home/elsearch/elasticsearch-7.3.0" >> .bashrc
echo "export PATH=$ES_HOME/bin:$PATH" >> .bashrc
# 如果解压的包不在/home/elsearch/下面,需要拿过来
# 切换用户
su elsearch
cd elasticsearch-7.3.0/bin/
sh elasticsearch &
如果出现启动失败,排查下内存是否足够,是否是root启动,是否文件句柄数足够,是否堆栈虚拟内存是否足够,具体修改方式,一捞一大把。
注意:安装 head 需要安装 node 和 npm 下载地址:https://github.com/mobz/elasticsearch-head.git 下载后执行:
# 安装 module
npm install
# 运行 head 插件
npm run start
在网页上访问http://192.168.0.158:9100/ 得到以下界面,(我的以下界面,已经添加了日志)
导图一张:
至此,ES搭建成功,下面重点讲如何部署这个klibana
cd /home/elsearch
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz
tar -zxvf kibana-7.3.0-linux-x86_64.tar.gz
cd kibana-7.3.0/config/
vim kibana.yml
配置文件修改如下
# 端口
server.port: 5601
# 指定本机 ip 让外部能访问
server.host: "0.0.0.0"
# 请求数据指向的 elasticsearch 服务器
elasticsearch.hosts: ["http://192.168.1.258:9200"]
在其安装的bin目录下执行
# nohup保证后台运行,如果直接运行脚本,界面退出后,会自动退出
nohup ./kibana --allow-root > kibana.log 2>&1
日志如下
访问 http://192.168.0.258:5601, 得到以下页面,代表启动成功。
索引列表
自定义索引模式
查看日志
具体操作细节,一捞一大把,这里不一一阐述了 下面继续来搞日志追踪
cd /home/elsearch
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz
tar -zxvf logstash-7.3.0.tar.gz
Logstash 管道有两个必需元素,输入和输出,以及一个可选元素 filter。输入插件使用来自源的数据,过滤器插件在您指定时修改数据,输出插件将数据写入目标。
bin/logstash -e 'input { stdin { } } output { stdout {} }'
e 标志使您可以直接从命令行指定配置。通过在命令行指定配置,可以快速测试配置,而无需在迭代之间编辑文件。示例中的管道从标准输入 stdin 获取输入,并以结构化格式将输入移动到标准输出 stdout。启动 Logstash 后,等到看到“Pipeline main started”,然后在命令提示符下输入 自定义的字符串 aaaaa
如图代表测试成功
cd logstash-7.3.0/config/
vim logstash-sample.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
#日志文件配置地址
tcp {
port => 4569
codec => "json"
}
}
# 分析、过滤插件,可以多个
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => ["http://192.168.1.258:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
更多配置 参照官网教程:
其中:
# 在其安装的bin目录下执行
# 配置文件和启动项放在同一目录,习惯管理
mv ../conf/logstash-sample.conf logstash-sample.conf
# 保证后台运行
nohup ./logstash -f logstash-sample.conf > runlogstash.log 2>&1 &
logstash 结合 filebeat 在分布式系统中,一台主机可能有多个应用,应用将日志输出到主机的指定目录,这时由 logstash 来搬运日志并解析日志,然后输出到 elasticsearch 上。由于于 logstash 是 java 应用,解析日志是非的消耗 cpu 和内存,logstash 安装在应用部署的机器上显得非常的笨重。最常见的做法是用 filebeat 部署在应用的机器上,logstash 单独部署,然后由 filebeat 将日志输出给 logstash 解析,解析完由 logstash 再传给 elasticsearch。
cd /home/elsearch
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-linux-x86_64.tar.gz
tar -zxvf filebeat-7.3.0-linux-x86_64.tar.gz
cd /filebeat-7.3.0-linux-x86_64/
vim filebeat.yml
配置文件修改如下
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
# 当前目录下的所有.log文件
- /home/elearning/jar/logs/*.log
#- c:\programdata\elasticsearch\logs\*
multiline.pattern: ^\[
multiline.negate: true
multiline.match: after
# 日志配置方式
- type: tcp
enabled: true
max_message_size: 10MiB
host: "0.0.0.0:9000"
#============================= Filebeat modules ===============================
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: false
# Period on which files under path should be checked for changes
#reload.period: 10s
#==================== Elasticsearch template setting ==========================
setup.template.settings:
index.number_of_shards: 1
#index.codec: best_compression
#_source.enabled: false
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["192.168.1.258:5044"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
格式一定要对齐。
在其安装的目录下执行
# nohup保证后台运行,如果直接运行脚本,界面退出后,会自动退出
nohup ./filebeat -e >filebeat.log 2>&1 &
启动成功日志如下
推送日志到logstash截图如下
回头看klibana是否回显日志
我的日志目前已经在测试环境上,接下来看springcloud结合log4j整合filebeat
<!-- Logstash -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
<if condition='property("ELK_MODE").toUpperCase().contains("TRUE")'>
<then>
<appender name="STDOUT_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${DESTINATION}destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTCtimeZone>
timestamp>
<pattern>
<pattern>
{
"traceId": "%X{traceId}",
"logLevel": "%level",
"serviceName": "${springAppName:-SpringApp}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"line":"%L",
"message": "%message"
}
pattern>
pattern>
providers>
encoder>
appender>
then>
if>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="${STDOUT_APPENDER}"/>
root>
public class LoggerStartupListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {
@Override
public void start() {
//获取日志组件上下文,并对其动态赋值
Context context = getContext();
context.putProperty("ELK_MODE", "FALSE");
context.putProperty("STDOUT_APPENDER", "STDOUT");
context.putProperty("INFO_APPENDER", "INFO");
context.putProperty("ERROR_APPENDER", "ERROR");
context.putProperty("DESTINATION", "127.0.0.1:9000");
// 环境变量配置的filebeat/logstash地址 192.168.1.258:9000
//ElkPropsUtil 获取环境变量工具类,大家自行封装就好
String destination = ElkPropsUtil.getDestination();
if (StringUtil.isNotBlank(destination)) {
context.putProperty("ELK_MODE", "TRUE");
context.putProperty("STDOUT_APPENDER", "STDOUT_LOGSTASH");
context.putProperty("INFO_APPENDER", "INFO_LOGSTASH");
context.putProperty("ERROR_APPENDER", "ERROR_LOGSTASH");
context.putProperty("DESTINATION", destination);
}
}
至此整合完毕,这里只是简单的介绍了 ELK 的基础安装使用,更多的高级功能,还需要小伙伴自己去玩。如果有什么问题,欢迎留言讨论。