上一代的日志分析系统springboot+log4j+flume+kafka
仿佛还是昨天,现在已经流行起了新一代的springboot2+logback+logstash+elasticsearch
的日志分析系统,借助es强大的生态圈以及全文搜索能力,实现日志收集/分析/检索不再是难事。
日志收集分为两种情况:
logback直接输出到logstash
,通过Tcp/Socket等传输(网络开销),当量太大时Logstash会做一个缓存队列处理,减少了filebeat去读取抓取日志的步骤。filebeat实时抓取日志文件
(性能开销),再传输到logstash。第二种情况的旧版flume方案就存在很大的缺点
:在日志的产生端LogServer服务器重,部署FlumeAgent,然后实时监控产生的日志,再发送至Kafka。每一个FlumeAgent都占用了较大的系统资源,有时候LogServer性能开销大,CPU资源尤其紧张,所以实时收集分析日志,就必须交给一个更轻量级
、占用资源更少
的日志收集框架,例如filebeat
。
从功能
上看,ElasticSearch负责数据的存储和检索,Kibana提供图形界面便于管理,Logstash是个日志中转站负责给ElasticSearch输出信息。
从流程
上看,Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.1.tar.gz
sh ./logstash -e 'input { stdin { } } output { stdout {} }'
,输入任意命令测试是否成功,这是标准手动输入输出模式。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
关于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
{
"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"
}
ERROR in net.logstash.logback.appender.LogstashTcpSocketAppender[stash] - Unable start disruptor java.lang.NoSuchMethodError
)
<dependency>
<groupId>net.logstash.logbackgroupId>
<artifactId>logstash-logback-encoderartifactId>
<version>5.3version>
dependency>
TCP Appenders
部分logback.xml
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:9250destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
root>
configuration>
@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);
}
}
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
查看已经建立的index patten
,Time Filter by Timestamp,时间过滤器按照指定的时间段展示搜索结果。设置了 index contains time-based events 和 time-field 的索引模式可以使用时间过滤器。
要使用Kibana,就需要通过配置一个或多个索引模式来告诉它您想探索的 Elasticsearch 索引(相当于创建es连接)。创建连接之后可以:
Discover
中以交互方式探索您的数据。Visualize
中以图表,表格,仪表,标签云等形式显示数据。Canvas
演示文稿中展示您的数据。Maps
将其可视化。另外,
时间戳
字段,并且您想将这个字段用于执行基于时间比较的操作,请选择 索引含有带时间戳的事件 选项,Kibana 会读取索引映射并列出包含时间戳的所有字段,从中选择您需要的字段即可(例如@TimeStamp)。限制
基于时间
的索引模式的通配符扩展
,(因为这意义不大,且浪费时间,尽量用正常的比较操作)符,范围为当前选定时间内的索引数据。点击“当搜索时不要展开索引模式”选项来禁用此行为(即不走时间索引)。数据探索(Discover)
页面负责交互式地探索es数据:
时序控件(Timelion)是一款时间序列数据可视化工具,它可以将多种独立的数据源合并呈现到一张视图上。它是由一个简单的表达式语言驱动的,用来检索时间序列数据,执行计算得出复杂问题的答案,并可视化结果。
Timelion 可以让您轻松获得如下问题的答案:
更多详情可以访问官方使用手册 https://www.elastic.co/guide/cn/kibana/current/timelion-create.html
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct')
Oh My God ,System Error when 2019-08-10 18:35:00
的返回信息。localhost:9200
,看到日志传输成功关于探索Kibana更多功能可以查看官方的中文手册 https://www.elastic.co/guide/cn/kibana/current/index.html