需求:我们需要把线上日志收集起来进行分析。在开发阶段,更多的时候程序是运行在本地,所以使用FileBeats就有点繁琐。我们采用直接将日志通过tcp输出到logstash的方案。

同时,我们的日志并没有统一的格式,按照日志分析的需求格式都不一样。比如我们需要监控http请求的日志,监控websocket对话的日志,监控搜索关键词的日志等等。这就需要我们需要根据不同的需求制定各自的格式,然后分开输出到ES数据库。

一、安装ELK

这里对此不作过多讲解。es我使用的是docker版本,logstash的docker版本有点问题,所以最终使用的是rpm版本。

二、配置文件

我们就按照http和ws两种日志来处理。

创建logstash.conf文件,内容如下:

input {tcp {mode => "server"host => "0.0.0.0"port => 4560codec => json_lines}
}filter {grok {match => ["message","%{NOTSPACE:tag}[T ]%{NOTSPACE:method}[T ]%{NOTSPACE:api}[T ]%{NOTSPACE:params}","message","%{NOTSPACE:tag}[T ]%{NOTSPACE:author}[T ]%{NOTSPACE:msg}"]}
}output {if[tag]=="HTTP"{elasticsearch {hosts => ["192.168.0.101:9200"]index => "logstash-test-http-%{+YYYY.MM.dd}"}}if[tag]=="WS"{elasticsearch {hosts => ["192.168.0.101:9200"]index => "logstash-test-ws-%{+YYYY.MM.dd}"}}
}

大致讲解一下:

输入使用tcp插件。

过滤插件grok针对两种日志进行处理,我们设置两个标记HTTP和WS,把这两个值放在message的前边,HTTP日志用空格分成了四段,而WS日志只有三段。

这里要说明的是,日志格式都是简单地使用空格分隔,所以每一段输出的内容就不能带空格,否则解析会出错。如果确实需要空格,则每段信息就需要用符号进行分隔或者包裹,比如方括号。

输出插件根据处理之后的tag字段,按照不同的结构把数据写入到ES不同的index中。

logstash的运行命令

logstash -f /etc/logstash/conf.d/logstash.conf

如果测试完成,可以使用后台运行命令:

nohup logstash -f /etc/logstash/conf.d/logstash.conf >/var/log/logstash.log 2>&1 &

日志文件的位置需要提前创建。

三、Springboot项目

创建一个普通的Springboot项目。

1. 在pom中加入logstash依赖:

        <!--logStash--><dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>5.3</version></dependency>

2. 在静态资源文件夹下创建logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="springAppName" value="LogstashTest"/><include resource="org/springframework/boot/logging/logback/base.xml" /><appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><!--配置logStash 服务地址--><destination>192.168.0.101:4560</destination><!-- 日志输出编码 --><encoder charset="UTF-8"class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>UTC</timeZone></timestamp><pattern><pattern>{"logLevel": "%level","serviceName": "${springAppName:-}","pid": "${PID:-}","thread": "%thread","class": "%logger{40}","message": "%message"}</pattern></pattern></providers></encoder></appender><root level="INFO"><appender-ref ref="LOGSTASH" /><appender-ref ref="CONSOLE" /></root>
</configuration>

主要关注LOGSTASH的appender,以及相关的级别设置。

3. yml文件

server:port: 8011
spring:application:name: logstash-test
logging:level:com.chris.log: debug

注意日志级别设置,否则日志不能输出。

4.写一个用于测试的接口

@RestController
@RequestMapping("api")
public class TestController {Logger logger = LoggerFactory.getLogger(TestController.class);/*** 测试不同格式的message过滤处理之后写入不同的elasticsearch-index** @param type* @return*/@GetMapping("test")public Boolean test(int type) {switch (type) {case 1:logger.info("{} {} {} {}", "HTTP", "GET", "/api/test", "none");break;case 2:logger.info("{} {} {} {}", "HTTP", "POST", "/api/test", "天王盖地虎");break;case 3:logger.info("{} {} {}", "WS", "ChenFabao", "我已到达");break;default:logger.info("{} {} {} {}", "HTTP", "GET", "/api/test", "other");break;}return true;}
}

这里可以看出,第三条ws日志与http日志格式不同。

四、测试

运行起来,调用接口

http://localhost:8011/api/test?type=3

改变参数,刷新ES,可以看到出现了两个不同的index,查看内容,数据得到了正确的解析,结构也有分别。这样就便于我们正确查询和处理线上日志,解决bug。

五、问题

由于是临时方案,也遇到一个问题。用例是,应用程序修改了一点代码,然后重新运行,这时logstash就会报Connection reset by peer的错误,意思是tcp链接出现了问题。目前研究得比较浅,不知道怎么处理。看来如果需要在线上收集日志而不出现这个问题,还是借用FileBeats中转一下比较好,或者使用file输入插件读取日志文件来输入。

Springboot项目通过logstash将日志分类写入Elasticsearch相关推荐

  1. idea 跑springboot项目不报log日志

    idea 跑springboot项目不报log日志 application.yml中指定了某一配置文件生效,但是在logback-spring.xml中没有配置

  2. 基于logstash实现日志文件同步elasticsearch

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  3. linux 自动运行.out,linux系统定时自动重启springboot项目

    一.创建脚本auto_reset_springboot.sh,tempurl:项目文件夹路径 !/bin/bash ID=`ps -ef | grep java| grep -v "grep ...

  4. logStash收集日志并存储到Elasticsearch

    为什么80%的码农都做不了架构师?>>>    上一节说道如何用logStash收集日志,结合Elasticsearch 进行日志收集和存储 logStash配置如下 input { ...

  5. [Golang] 消费Kafka的日志提交到ElasticSearch

    0x0 需求 消费Kafka的日志并写入ElasticSearch供查询 0x1 依赖库 golang版Kafka客户端 https://github.com/Shopify/sarama golan ...

  6. springboot项目中日志分类

    # 日志分类: - 一种是rootLogger(根全局日志) : 用来监听项目中所有的运行日志 包括引入依赖jar中的日志 - 一种是logger(指定包级别日志) : 用来监听项目中指定包中的日志信 ...

  7. 基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率

    基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率 1.拉取logstash,kibana,es,mysql镜像 #命令 ...

  8. SpringBoot 项目使用 SLF4J+logback 进行日志记录,来增强可维护性

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:云深不知处 blog. ...

  9. springboot项目输入打印日志文件到本地

    springboot项目输入打印日志文件到本地 pom.xml中添加jar包: <dependency><groupId>ch.qos.logback</groupId& ...

最新文章

  1. mysql和jdbc的区别_JDBC详解
  2. 中国AI开发者真实现状:写代码这条路,会走多久?
  3. Dell 2950服务器CPU-E1422错误解决方法
  4. 大型网站架构演化发展历程
  5. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
  6. 安装python环境与运行_专栏G|轻松学Python01:Python环境搭建与运行
  7. 修复虚拟磁盘LVM表
  8. Google Authenticator加强ssh安全
  9. ubuntu中关闭防火墙
  10. Atitit zip解压文件 java use apache ant.jar C:\0wkspc\hislog\src\main\java\com\attilax\compress\ZipUt
  11. JDBC:OJDBC
  12. python语言创意绘画-有奖|这 18 个好用的正版软件、热门的付费教程限时超低价了...
  13. stc15w4k32s4最小系统原理图_单片机最小系统原理图,求详细讲解
  14. 大前端-阶段2 - 模块2 - 前端工程化实战-模块化开发(ESModule)-打包工具(webpack4)
  15. java技术英文名词读音_Java开发,Java development,音标,读音,翻译,英文例句,英语词典...
  16. JS中的curry化(柯里化)
  17. 方法重写(override)遵循的原则
  18. 第九届中国云计算大会讲师团探秘 ——数位院士领衔、近20个国家的学者共聚、多个行业领头人及专家参与, 共话云计算大数据生态、应用...
  19. ADSP-21489的图形化编程详解(3:音效开发例程-直通三个例程讲清楚)
  20. 远程桌面系统管理员已经限制你登录的计算机,远程桌面由于帐户限制你无法登录问题...

热门文章

  1. struts2快速入门
  2. 【转】搜索引擎/网络蜘蛛程序源代码
  3. 西安交通大学915-2021-编程1
  4. cc linux教程 pdf,CentOS 5.5 PDF转TXT
  5. 李群、李代数等机器人学数学概念
  6. el-tooltip配合el-button禁用时显示提示
  7. 天池赛:世界杯数据可视化分析
  8. 1091 Acute Stroke (PAT甲级)
  9. ROS之Hello word 程序
  10. 布里渊增益谱的压缩采样及重构