原创/朱季谦
 
最近在做一个将分布式系统的日志数据通过logstash传到kafka的功能,做完之后决定业余搭一个ELK日志分析系统,将logstash采集到的日志传给Elasticsearch。经过一番捣鼓,也把这个过程给走通了,于是写了这篇总结,可按照以下步骤搭建logstash采集spring日志数据并传输给Elasticsearch。
 
首先,logstash是一个开源的数据收集引擎,能够同时从多个来源采集到数据,并将数据转发到想存储的“库”中。例如,logstash可以采集数据转发存储到Elasticsearch,也可以转发到kafka等消息中间件里。logstash拥有强大的插件生态,包括基本的http、tcp、udp、file以及kafa、redis等等。这些插件,在logstash5.x版本以上的,是已经自带了,不需要额外安装。
 
在基于ssm的开发过程中,运行Spring项目时,可以在控制台上看到log的日志打印信息,我们可以把这些日志信息的ERROR日志进行监听和转发存储。
如何实现logstash来监听Spring项目的日志并将ERROR数据进行转发存储呢?
部署架构图:
可以按照以下流程来实现:
1.下载logstash。
根据以下地址来网盘获取logstash-5.5.2版本的:
链接:https://pan.baidu.com/s/1h7xo65P7_O76Azt0-I-2-A
提取码:95vg
2.安装logstash
直接把压缩包压缩到本地某个盘里就可以了,不需要做额外操作了,5.x以上版本的logstash是不需要安装其他插件,已经自带大部分插件。
3.验证是否安装成功
运行cmd,进入logstash的bin目录下,运行指令:logstash -e 'input{stdin{}} output{stdout{}}'
运行成功的截图如下,即为安装并启动成功:
 
启动以后,在光标处输入:hellowrold
正常情况下,会显示以下信息,证明logstash可以正常使用了。
在这个过程里,涉及到几个概念,logstash是一个管道,里面有两个input和output的必选元素,即输入与输出,之间还可以有一个可选的过滤器filter过滤器。input插件从源头获取到数据,过滤器会根据条件来进行修改,最后通过ouput插件将数据传输,可输出给Elasticsearch、kafka、file
等。
处理过程模型图如下:
Logstash 提供了一个 shell 脚本叫 logstash,支持以下运行参数:
执行命令: -e 执行-e后面的参数:logstash -e 'input{stdin{}} output{stdout{}}'
执行文件: --config 或 -f 执行-f后面的conf文件:logstash -f logstash.conf
输入插件:input{ … }
过滤插件:filter{ … }
输出插件:output{ … }
测试配置文件是否正确,然后退出:-t
在这篇文章里,主要用到以上这些命令,其余读者若感兴趣可以自行去研究探索。
 
4.配置一个文件**.conf
可以在bin目录或者config目录或者其他目录下,新建一个**.conf文件,我选择的是bin目录下,新建文件logstash.conf,截图如下:
在logstash.conf文件里配置信息:

 input { stdin { } }#该行可有可无,写来打印测试而已
input {
#开启tcp插件的监听
tcp {
#这个需要配置成本机IP,不然logstash无法启动
host => "127.0.0.1"
#端口号
port => 9600
#将日志以json格式输入
codec => json_lines
}
} output {
#输出打印
stdout { codec => rubydebug }
}

配置好,就可以先启动进行监听了,启动命令:先cd进到存放logstash.conf的目录下,我的目录在bin里,所以进入的是bin目录,执行:logstash -f logstash.conf。

5.在spring进行logstash配置的maven依赖引入
我在项目里用到的开源日志组件是logback它是log4j的改良,主要分为以下三个模块:
logback-classic:log4j的一个改良版本,完整实现了slf4j API,可以方便更换成其它日志系统如log4j或JDK14 Logging。
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。
logback-core:是其它两个模块的基础模块。
logback需要在maven里引用到的依赖:

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>net.logstash.log4j</groupId>
<artifactId>jsonevent-layout</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.0</version>
</dependency>

如果引用到的ch.qos.logback依赖版本太低的话,可能会出现以下错误:java.lang.NoSuchMethodError: ch.qos.logback.core.util.Loader.getResourceOccurrenceCount(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set;可以根据项目需求来选择合适的版本,经过测试,以上的1.2.3版本是可以符合要求的。配置完成依赖后,就可以开始进行下一步配置。

6.在spring的logback.xml里进行logstash配置(省略logback其余无关该流程的部分)

 <!--开启tcp格式的logstash传输,通过TCP协议连接Logstash-->
<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:9600</destination> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<jsonFactoryDecorator class="net.logstash.logback.decorate.CharacterEscapesJsonFactoryDecorator">
<escape>
<targetCharacterCode>10</targetCharacterCode>
<escapeSequence>\u2028</escapeSequence>
</escape>
</jsonFactoryDecorator>
<providers>
<pattern>
<pattern>
{
"timestamp":"%date{ISO8601}",
"user":"test",
"message":"[%d{yyyy-MM-dd HH:mm:ss.SSS}][%p][%t][%l{80}|%L]%m"}%n
}
</pattern>
</pattern>
</providers>
</encoder>
<keepAliveDuration>5 minutes</keepAliveDuration>
</appender> <root level="INFO">
<appender-ref ref="STASH"/>
</root>
配置说明:
encoder:配置的规范;
LoggingEventCompositeJsonEncoder:json格式的编码器,即将日志数据转换成json格式;
jsonFactoryDecorator:解决中文转码的问题;
providers:json格式提供者,对json进行一个定制化设置,比如,timestamp,message,thread_name等,其他的自定义的字段的值可以通过MDC设置进来,格式就是%date{xx},
注意:按照上面的设置,logstash才可以正常接收到日志数据,否则是无法接收到的。
destination定义的ip与端口与logstash里的logstash.conf需一直,logstash.conf里的tcp会一直监听这个ip的端口:
配置完成后,启动spring项目,这时原来监听tcp的logstash就可以实时监听接收到了数据,logstash的控制台显示打印如下:
若要监听到的是ERROR级别的日志,在logback.xml里的logstash配置里的appender里添加一行以下代码即可:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
在日志级别修改为以下即可:
1 <root level="INFO">
<appender-ref ref="STASH"/>
<appender-ref ref="ERROR"/>
</root>

7.到这一步,就完成了通过logstash收集spring的logback日志的功能,在这个基础上,可以再进一步扩展,扩展将logstash采集到的数据输出到Elasticsearch。

  input { stdin { } }#该行可有可无
input {
#开启tcp模式的监听
tcp {
#这个需要配置成本机IP,不然logstash无法启动
host => "127.0.0.1"
#端口号
port => 9600
#将日志以json格式输入
codec => json_lines
}
} output {
#输出打印
stdout { codec => rubydebug }
elasticsearch { hosts => ["127.0.0.1:9200"] }
}

打开已经本地安装的Elasticsearch:http://127.0.0.1:9100/,可以看到,ES可以接受到logstash接收到的数据了:

spring项目与logstash和Elasticsearch整合的更多相关文章

  1. 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计

    一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...

  2. Guava Cache探索及spring项目整合GuavaCache实例

    背景 对于高频访问但是低频更新的数据我们一般会做缓存,尤其是在并发量比较高的业务里,原始的手段我们可以使用HashMap或者ConcurrentHashMap来存储. 这样没什么毛病,但是会面临一个问 ...

  3. 使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存

      Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是 ...

  4. 解决Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of the configured nodes are available

    Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of ...

  5. 02篇ELK日志系统——升级版集群之kibana和logstash的搭建整合

    [ 前言:01篇LK日志系统已经把es集群搭建好了,接下来02篇搭建kibana和logstash,并整合完成整个ELK日志系统的初步搭建. ] 1.安装kibana 3台服务器: 192.168.2 ...

  6. 手动创建Spring项目 Spring framework

    之前学习框架一直是看的视频教程,并且在都配套有项目源码,跟着视频敲代码总是很简单,现在想深入了解,自己从官网下载文件手动搭建,就遇到了很多问题记载如下. 首先熟悉一下spring的官方网站:http: ...

  7. log4net.redis+logstash+kibana+elasticsearch+redis 实现日志系统

    前端时间写了个随笔 log4net.NoSql +ElasticSearch 实现日志记录 ,因项目原因需要把日志根java平台的同事集成采用logstash+kibana+elasticsearch ...

  8. (转) Spring读书笔记-----部署我的第一个Spring项目

    一.Spring介绍 Spring是一个轻量级的Java EE容器,它也是一种从实际需求出发,着眼于轻便,灵活,易于开发,易测试和易部署的轻量级开发框架.Spring它完成了大量开发中的通用步骤,留给 ...

  9. Spring读书笔记-----部署我的第一个Spring项目

    一.Spring介绍 Spring是一个轻量级的Java EE容器,它也是一种从实际需求出发,着眼于轻便,灵活,易于开发,易测试和易部署的轻量级开发框架.Spring它完成了大量开发中的通用步骤,留给 ...

随机推荐

  1. tomcat启动nio,apr详解以及配置

    tomcat启动nio,apr详解以及配置 前言 在正文开始之前,我们先在idea工具中看看启动的信息,顺便看下启动的基本信息 在这里插入图片描述可以看到信息有tomcat版本操作系统版本java版本 ...

  2. 「每日五分钟,玩转JVM」:线程独占区

    前言 如果我们对计算机组成有所了解,那么我们一定会知道在计算机中有一块儿特殊的区域,称之为寄存器,寄存器包括了指令寄存器和程序计数器,这两样位于CPU中,作为程序运行的大脑来控制程序的运行和流转. 而 ...

  3. 9406LaTeX公式

    需要注意的是: 1.本文只对第四章排版数学公式进行简单整理 2.本文大量内容直接引自官网,尤其是涉及4.开头的标题,为方便读者查阅对比,就不一一删改和引注,你可以点此访问官网对应内容,也可以点此下载我 ...

  4. Leetcode之二分法专题-367. 有效的完全平方数(Valid Perfect Square)

    Leetcode之二分法专题-367. 有效的完全平方数(Valid Perfect Square) 给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 ...

  5. JSP学习笔记(3)——JSTL 标签库

    JSP Standard Tag Lib,名为JSP标准标签库,设计的目的主要用来方便我们将数据输出,而不是使用JSP中的语法<% %> <%= %> <%! %> ...

  6. flutter无线调试与打包

    1.WIFI连接设备 设备打开开发者选项 -> 点击WIFI调试 ->  项目目录下输入终端命令: adb connect   设备ip地址:[端口号(一般是5555)] 2.apk打包 ...

  7. 数据结构C线性表现实

    linearList.h #ifndef _INC_STDIO_8787 #define _INC_STDIO_8787 #include <stdio.h> #include <m ...

  8. 第10章 文档对象模型DOM 10.2 Document类型

    Document 类型 JavaScript 通过 Document 类型表示文档.在浏览器中, document 对象是 HTMLDocument (继承自 Document 类型)的一个实例,表示 ...

  9. JavaScript get set方法 ES5/ES6写法

    网上鲜有get和set的方法的实例,在这边再mark一下. get和set我个人理解本身只是一个语法糖,它定义的属性相当于“存储器属性” 为内部属性提供了一个方便习惯的读/写方式 ES5写法 func ...

  10. [python]python子字符串的提取、字符串连接、字符串重复

    1. python使用索引运算符[]和切片运算符[:],来提取字符串. 第一个字符的索引是0,最有一个字符的索引是-1,切片运算符[x:y]表示提取从索引x到索引y-1的字符,不包含索引y. 示例: ...