logstash是一个开源的数据收集引擎,支持各种输入选择,能够同时从多个来源采集数据,将数据转发到想存储的“库”中,例如,可以转发存储到Elasticsearch,也可以转发到kafka等消息中间件里。logstash拥有强大的插件生态,包括基本的http、tcp、udp、file以及kafa、redis等等。
运行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{}}'
运行成功的截图如下,即为安装并启动成功:

启动以后,在光标处输入:hello wrold

正常情况下,会显示以下信息,证明logstash可以正常使用了。

在这个过程里,涉及到几个概念,logstash是一个管道,里面有两个input和output的必选元素,即输入与输出,之间还可以有一个可选的过滤器filter过滤器。input插件从源头获取到数据,过滤器会根据条件来进行修改,最后通过ouput插件将数据传输,可输出给Elasticsearch、kafka、file

等。这几个东西都是插件,在logstash5.x版本以上的,是已经自带了,不需要额外安装。
 
处理过程模型图如下:
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目录等地方,我选择的是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 }
 }
配置好,就可以先启动进行监听了,启动命令:
先进到存放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配置
<!--logstash配置-->
<!--开启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>
在日志级别修改为以下即可:
<root level="INFO">
    <appender-ref ref="STASH"/>
    <appender-ref ref="ERROR"/>
</root>
到这一步,就完成了通过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接收到的数据了:

 
 
作者:朱季谦
出处:https://www.cnblogs.com/zhujiqian/
本文版权归作者和博客园共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!

spring与logstash整合,并将数据传输到Elasticsearch的更多相关文章

  1. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  2. Spring Security 3整合CAS 实现SSO

    spring security 3整合cas client用于实现各Application之间的单点登录. 1. 需要准备的jar spring-security-core-3.0.8.RELEASE ...

  3. 1.springMVC+spring+Mybatis的整合思路

    SSM整合的过程:就是把一些东西交给spring管理,也就是添加配置文件的一个过程.那么有哪些东西我们要交给spring管理呢?大概有以下几个: 1.数据源(可配置数据库连接池) 2.SqlSessi ...

  4. Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...

  5. Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...

  6. Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析

    前言 本文将分析mybatis与spring整合的MapperScannerConfigurer的底层原理,之前已经分析过java中实现动态,可以使用jdk自带api和cglib第三方库生成动态代理. ...

  7. Mybatis学习--spring和Mybatis整合

    简介 在前面写测试代码的时候,不管是基于原始dao还是Mapper接口开发都有许多的重复代码,将spring和mybatis整合可以减少这个重复代码,通过spring的模板方法模式,将这些重复的代码进 ...

  8. Spring(八)SSH整合简述

    一.Spring与Struts2的整合 1.1.整合步骤 1.2.配置web.xml 1.3.配置spring配置文件applicationContext.xml 1.4.配置struts配置文件 1 ...

  9. Spring学习6-Spring整合Struts2

    一.Spring为什么要整合Struts2     Struts2与Spring进行整合的根本目的就是要让 Spring为Struts2的Action注入所需的资源对象,它们整合的原理则是只要导入了s ...

随机推荐

  1. 编程题及解题思路(1,String)

    题目描述 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,F ...

  2. 玩转SpringBoot 2 快速搭建 | Spring Initializr 篇

    SpringBoot 为我们提供了外网 Spring Initializr 网页版来帮助我们快速搭建 SpringBoot 项目,如果你不想用 IDEA 中的插件,这种方式也是不错的选择.闲话少说,直 ...

  3. JDBC之PreparedStatement

    JDBC之PreparedStatement 一.java.sql.PreparedStatement接口简介 该接口表示预编译的 SQL 语句的对象. SQL 语句被预编译并存储在 Prepared ...

  4. Condition控制线程通信

    Condition控制线程通信 一.前言 java.util.concurrent.locks.Condition 接口描述了可能会与锁有关联的条件变量.这些变量在用法上与使用Object.wait ...

  5. Storm 系列(五)—— Storm 编程模型详解

    一.简介 下图为 Strom 的运行流程图,在开发 Storm 流处理程序时,我们需要采用内置或自定义实现 spout(数据源) 和 bolt(处理单元),并通过 TopologyBuilder 将它 ...

  6. 理解Js的parseInt(转)

    parseInt() 方法首先查看位置 0 处的字符,判断它是否是个有效数字:如果不是,该方法将返回 NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法将查看位置 1 处的字符,进行同样的测 ...

  7. Minimum spanning tree for each edge(倍增LCA)

    https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...

  8. 杭电多校第十场 hdu6435 CSGO 二进制枚举子集

    CSGO Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Subm ...

  9. CodeForces 982 D Shark

    Shark 题意:一个研究员观察了一条鲨鱼n天的运动,然后这条鲨鱼他只会往前走,不会回到去过的地方,现在有一个k,,如果鲨鱼当天游过的距离 >= k, 代表的鲨鱼在这天会前往下一个地点,现在求鲨 ...

  10. 深入拆解Java虚拟机视频教程

    目录: 第1节说在前面的话   00:05:07分钟   | 第3节环境搭建以及jdk,jre,jvm的关系   00:20:48分钟   | 第5节jvm再体验-jvm可视化监控工具   00:21 ...