前言
上一代的日志分析系统springboot+log4j+flume+kafka
仿佛还是昨天,现在已经流行起了新一代的springboot2+logback+logstash+elasticsearch
的日志分析系统,借助es强大的生态圈以及全文搜索能力,实现日志收集/分析/检索不再是难事。
日志收集分为两种情况:
- (本文)
logback直接输出到logstash
,通过Tcp/Socket等传输(网络开销),当量太大时Logstash会做一个缓存队列处理,减少了filebeat去读取抓取日志的步骤。 - logback输出日志到日志文件,
filebeat实时抓取日志文件
(性能开销),再传输到logstash。
第二种情况的旧版flume方案就存在很大的缺点
:在日志的产生端LogServer服务器重,部署FlumeAgent,然后实时监控产生的日志,再发送至Kafka。每一个FlumeAgent都占用了较大的系统资源,有时候LogServer性能开销大,CPU资源尤其紧张,所以实时收集分析日志,就必须交给一个更轻量级
、占用资源更少
的日志收集框架,例如filebeat
。
什么是ELK?
从功能
上看,ElasticSearch负责数据的存储和检索,Kibana提供图形界面便于管理,Logstash是个日志中转站负责给ElasticSearch输出信息。
从流程
上看,Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。
Logstash部分
下载&安装logstash
- logstash可以从以下地址下载,logstash和elasticsearch的版本要匹配,因为我们用的es是6.8.1,所以这里用了6.8.1的logstash,如果你是7.3.0则用7.3.0对应起来即可。
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.1.tar.gz
- 这个包无论是windows或者linux都可用,解压即用
- (Linux下)cd到logstash目录下的bin目录,输入
sh ./logstash -e 'input { stdin { } } output { stdout {} }'
,输入任意命令测试是否成功,这是标准手动输入输出模式。
配置logstash
- 进入bin目录,
copy
一份logstash-sample.conf文件并重命名为到logstash.conf
(或者直接新建一个logstash.conf文件),修改为以下内容(先注释掉elasticsearch部分,查看控制台是否输出,判断logback->logstash是否生效!!!
):
# Logback -> Logstash -> Elasticsearch pipeline.
# by zhengkai.blog.csdn.net
input {
tcp {
host => "127.0.0.1"
port => 9250
mode => "server"
tags => ["tags"]
codec => json_lines
}
}
output {
#控制台直接输出
stdout{
codec => rubydebug
}
#可以注释掉elasticsearch部分,查看控制台是否输出,判断logback->logstash是否生效,@zhengkai.blog.csdn.net
elasticsearch {
hosts => ["127.0.0.1:9200"]
action => "index"
index => "mylog"
}
}
- 修改
pipelines.yml
文件
- pipeline.id: test
pipeline.workers: 1
pipeline.batch.size: 1
#config.string: "input { stdin { } } output { stdout {} }"
path.config: "/SWDTOOLS/logstash-6.8.1/config/logstash.conf"
运行logstash
.bat(windows) ,logstash.sh(linux)
补充一点,output配置中的ElasticSearch部分是通过logstash-output-elasticsearch
插件的方式实现的,链接是官方插件手册,可供查询详细配置 https://www.elastic.co/guide/en/logstash/6.8/plugins-outputs-elasticsearch.html
ElasticSearch部分
ElasticSearch下载和运行
ElasticSearch
关于es部分,可以之前的文章pringBoot2整合ElasticSearch(包含ElasticSearch入门+spring-boot-starter-data-elasticsearch)
- 下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.1.zip
,当然如果太慢可以自己换aria2下载,(另外,如果从官网https://www.elastic.co/cn/downloads/elasticsearch下载Elasticsearch,下载到的版本太新,7.X可能存在兼容性问题,最好Logstash和ElasticSearch一样都是6.8.1
版本) - 进入
/bin
目录,chmod +x elasticsearch 进
行授权 - 无需额外配置,可以以默认配置运行
- 运行
./elasticsearch -d
即可(Ubuntu直接运行 sh elasticsearch 会报错,在Windows下运行 elasticsearch.bat 则没问题)
moshow@moshow-ThinkCentre-M900:~/Development/Environment/elasticsearch-6.8.1/bin$ sh elasticsearch
elasticsearch: 17: elasticsearch: source: not found
elasticsearch: 1: elasticsearch: : Permission denied
elasticsearch: 21: elasticsearch: Bad substitution
- 打开http://localhost:9200/验证是否成功
{
"name" : "bOUWfou",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "l0CZWkdcTdCo6pZFO_jU4A",
"version" : {
"number" : "6.8.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "1fad4e1",
"build_date" : "2019-06-18T13:16:52.517138Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
SpringBoot&Logback部分
Maven依赖
- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder 建议使用版本5.2以上的,版本过低会有兼容性问题(例如
ERROR in net.logstash.logback.appender.LogstashTcpSocketAppender[stash] - Unable start disruptor java.lang.NoSuchMethodError
)
<!-- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
Logback TCP Appenders配置
- 可以到官方github文档 https://github.com/logstash/logstash-logback-encoder 搜一下
TCP Appenders
部分 - 参照文档,我们在项目的resources目录里面里新建
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:9250</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
Controller
- (Suggest)使用lombok的
@Slf4j
注解,可以直接log.info()/log.error()
调用slf4j进行输出 - (不建议)或者使用原生
private final Logger log = LoggerFactory.getLogger(getClass());
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class DemoController {
@GetMapping
public Object index(){
String msg="Oh My God ,System Error when "+ DateUtil.now();
log.error(msg);
return ResponseEntity.ok(msg);
}
}
- 查看Logstash控制台输出情况
LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError问题
- es无法连接情况,多数是es不可用或者有代理之类的情况:
Kibana部分
下载&安装
-
wget或者aria2c下载6.8.1版的Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.1-linux-x86_64.tar.gz
-
解压文件
tar -xzf kibana-6.8.1-linux-x86_64.tar.gz
-
进入kibana的bin目录,运直接
./bin/kibana
-
建立一个新
IndexPatten
,Filter选择时间戳即可 -
查看已经建立的
index patten
,Time Filter by Timestamp,时间过滤器按照指定的时间段展示搜索结果。设置了 index contains time-based events 和 time-field 的索引模式可以使用时间过滤器。
Index Patten索引模式
要使用Kibana,就需要通过配置一个或多个索引模式来告诉它您想探索的 Elasticsearch 索引(相当于创建es连接)。创建连接之后可以:
- 在
Discover
中以交互方式探索您的数据。 - 在
Visualize
中以图表,表格,仪表,标签云等形式显示数据。 - 在
Canvas
演示文稿中展示您的数据。 - 如果您的数据包含地理数据,请使用地图
Maps
将其可视化。
另外,
- 如果您的索引中含有一个
时间戳
字段,并且您想将这个字段用于执行基于时间比较的操作,请选择 索引含有带时间戳的事件 选项,Kibana 会读取索引映射并列出包含时间戳的所有字段,从中选择您需要的字段即可(例如@TimeStamp)。 - 默认情况下,Kibana 会
限制
基于时间
的索引模式的通配符扩展
,(因为这意义不大,且浪费时间,尽量用正常的比较操作)符,范围为当前选定时间内的索引数据。点击“当搜索时不要展开索引模式”选项来禁用此行为(即不走时间索引)。
Discover数据探索模块
数据探索(Discover)
页面负责交互式地探索es数据:
- 可以访问与选定索引模式匹配的每个索引中的每个文档。
- 可以提交搜索请求、过滤搜索结果、查看文档数据。
- 还可以看到与搜索查询匹配的文档数,并获取字段值的统计信息。
- 如果索引模式中配置了时间字段,您还可以在这个页面的顶部看到基于时间分布的文档数量柱状图。
Timelion时序控件
时序控件(Timelion)是一款时间序列数据可视化工具,它可以将多种独立的数据源合并呈现到一张视图上。它是由一个简单的表达式语言驱动的,用来检索时间序列数据,执行计算得出复杂问题的答案,并可视化结果。
Timelion 可以让您轻松获得如下问题的答案:
- 过去某段时间页面的 UV 量是多少?
- 本周五和上周五的流量有多少差异?
- 本站今天来自日本的访客占多少百分比?
- 标普500指数过去10天的移动平均值是多少?
- 过去两年所有的搜索请求总量有多少?
更多详情可以访问官方使用手册 https://www.elastic.co/guide/cn/kibana/current/timelion-create.html
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct')
效果演示
- 打开 http://localhost:9999/logstash/ ,看到
Oh My God ,System Error when 2019-08-10 18:35:00
的返回信息。
- 查看Logstash控制台,发现stdout输出以及没有es报错提示。
- 用插件elasticsearch-head查看ElasticSearch,默认连接地址
localhost:9200
,看到日志传输成功
- 进入Kibana的Discover模块进行搜索 http://localhost:5601/app/kibana#/discover
后言
关于探索Kibana更多功能可以查看官方的中文手册 https://www.elastic.co/guide/cn/kibana/current/index.html