Springboot项目搭配ELK日志平台

上一篇讲过了elasticsearch和kibana的可视化组合查询,这一篇就来看看大名鼎鼎的ELK日志平台是如何搞定的。

elasticsearch负责数据的存储和检索,kibana提供图形界面便于管理,Logstash是个日志中转站负责给elasticsearch输出信息。

1 安装logstash

这里使用和elasticsearch相同的版本2.3.4,wget https://download.elastic.co/logstash/logstash/logstash-2.3.4.tar.gz

由于logstash有压缩包,免安装的,下载后直接解压。tar -xzvf logstash-2.3.4.tar.gz

进入logstash目录,我们先来看看logstash的插件集合,bin/logstash-plugin list

图没截完,后面还有很多,从名字可以看到有codec、filter、input、output等,这些都是有用的。

等号我们讲到启动时带的config就会用到这些插件。先看一个logstash-codec-json-lines,这个是必须的,如果早期的版本装完logstash后没有这个插件,你就需要额外去下载它。

我们Springboot的项目日志就是以json的格式传给logstash的。

2 配置logstash

OK,别的不管,我们直接运行logstash。

bin/logstash

可以看到给的提示,只支持两个命令,logstash agent ,要注意不同的版本命令是不同的,最新的5.5.1就已经没有agent了,使用时需要注意看系统给的提示。

该版本的logstash启动命令是logstash agent -f conf/conf。即在logstash agent -f 后面加上你的配置文件。

该配置文件是不存在的,需要我们自己添加。

mkdir config 创建目录

vi config/log_es.conf 创建配置文件,配置文件名字随便起

1input { 2 # For detail config for log4j as input, 3 # See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html 4 tcp { 5 mode => "server" 6 host => "0.0.0.0" 7 port => 4567 8 codec => json_lines 9 } 10} 11filter { 12 #Only matched data are send to output. 13} 14output { 15 # For detail config for elasticsearch as output, 16 # See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html 17 elasticsearch { 18 action => "index" #The operation on ES 19 hosts => "localhost:9200" #ElasticSearch host, can be array. 20 index => "applog" #The index to write data to. 21 } 22}

这个就是一个简单的配置文件,看input、filter、output,这些都是在plugin list里出现过的,我这里用的tcp,代表日志的来源是以tcp的形式过来的。比较常用的有file,就是读取某个文件,如果你的日志是生成了日志文件,就可以在这里用input file去读取它。还有http、jdbc、kafka、redis等,都有人用,就是把日志丢到kafka中,logstash去获取。

filter是过滤器,可以在这里配置过滤哪些日志。

output标签也有很多,代表logstash要把接收到的日志往哪里输出,有stdout输出到控制台、email、csv、elasticsearch等。我们选择把日志输出到ES。看配置文件,设置ES的host为本机,当然你也可以选择远程的ES服务器,可以设置多个ES地址数组;index代表ES上的index,如果没有则创建该index;action为index代表动作,分别有“index”、“delete”、“create”、“update”。

你也可以输出到多个地方,譬如既插入ES又输出到控制台

1output{ 2 elasticsearch{ 3 hosts=>["172.132.12.3:9200"] 4 action=>"index" 5 index=>"applog" 6 #document_type=>"%{@type}" 7 document_id=>"ignore" 8 } 9 stdout{ 10 codec=>rubydebug 11 } 12}

index也可以动态指定,如果大家还记得上一篇kibana添加index时就是可以添加*匹配的index。

譬如我们可以用

index=>”applog-%{+YYYY,MM.dd}”

OK,设置完配置文件,我们就要启动logstash了。

bin/logstash agent -f config/log_es.conf

启动完成后,就可以在Springboot项目里通过ip:4567端口来输出日志到logstash了,logstash收到的日志就会自动往ES里插入了。

3 logback日志关联logstash

Springboot项目默认logback记录日志,之前已经详细讲过了logback的使用。当然你也可以使用log4j、log4j2,它们同样可以输出到logstash里。

新建Springboot项目,只勾选个web即可,logback和logstash关联需要依赖一个组件

1<dependency> 2 <groupId>net.logstash.logback</groupId> 3 <artifactId>logstash-logback-encoder</artifactId> 4 <version>4.11</version> 5 </dependency>

在pom.xml添加这个,然后在GitHub上看看用法 https://github.com/logstash/logstash-logback-encoder

在项目的文档里可以看到各种用法,里面有讲logback通过socket、tcp等方式将日志输出到logstash的。

参照文档,我们在项目里新建logback-spring.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<configuration> 3 <include resource="org/springframework/boot/logging/logback/base.xml" /> 4 5 <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> 6 <destination>你的ip地址:4567</destination> 7 <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /> 8 </appender> 9 10 <root level="INFO"> 11 <appender-ref ref="LOGSTASH" /> 12 <appender-ref ref="CONSOLE" /> 13 </root> 14 15 16</configuration>

配置好ip和logstash的配置文件input里你设置的端口。

4 使用kibana查看Springboot日志

上面配置好了logback和logstash的关联,我们就试着输出日志看看。

1@RestController 2public class IndexController { 3 private final Logger logger = LoggerFactory.getLogger(getClass()); 4 5 @GetMapping("/index") 6 public Object index() { 7 for (int i = 0; i < 100; i++) { 8 logger.debug("debug" + i); 9 logger.info("info" + i); 10 logger.warn("warn" + i); 11 logger.error("error" + i); 12 } 13 14 return "success"; 15 } 16}

启动项目,访问index。

然后看看日志存储情况

我们可以看到在kibana里和ES中都已经发现了这些日志信息了。

譬如我们做个条件搜索:

OK,通过这个简单的例子,我们就可以把Springboot日志输出到ELK日志平台了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )