Spring Boot直接输出到Logstash

Spring Boot应用程序可以直接远程输出到Logstash。这里以Logback日志为例,新建项目,在项目中加入Logstash依赖。

1、 要使用logback一个插件来将数据转成json,引入maven配置

dependency>

      <groupId>net.logstash.logback</groupId>

      <artifactId>logstash-logback-encoder</artifactId>

     <version>5.3</version>

</dependency>



2、配置 logback-spring.xml

接下来,在src/resources目录下创建logback-spring.xml配置文件,在配置文件中将对日志进行格式化,并且输出到控制台和Logstash。需要注意的是,在destination属性中配置的地址和端口要与Logstash输入源的地址和端口一致,比如这里使用的是127.0.0.1:4560,则在Logstash输入源中要与这个配置一致。其中logback-spring.xml内容如

<xml version="1.0" encoding="UTF-8"?>

    <configuration scan="true" scanPeriod="60 seconds" debug="true">

         <contextName>logstash-test</contextName>

   <!-- 这个是控制台日志输出格式 方便调试对比--->

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

      <encoder>

          <pattern>%d{yyyy-MM-dd HH:mm:ss} %contextName %-5level %logger{50} -%msg%n</pattern>

   </encoder>

</appender>

<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">

  <destination>127.0.0.1:4560</destination> 这是是logstash服务器地址 端口

  <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> 输出的格式,推荐使用这个

</appender>

<root level="info">

   <appender-ref ref="console"/>

   <appender-ref ref="stash"/>

</root>

启动项目,就会请求127.0.0.1:4560,如果有监听,就会自动发送日志。

3、logstash配置

input {

             tcp {

                        host => "localhost" #这个一定要是logstash本机ip,不然logstash 无法启动,也可以去除

                        port => 4560

                       codec => json_lines

                       mode => "server"

                  }

}

filter {

                 grok {

               match => {

"message" => "%{URIPATH:request} %{IP:clientip} %{NUMBER:response:int} \"%{WORD:sources}\" (?:%{URI:referrer}|-) \[%{GREEDYDATA:agent}\] \{%{GREEDYDATA:params}\}"

     }

}


output {

       stdout { codec => rubydebug } #标准输出,在命令行中输出方便调试

elasticsearch { hosts => [ "localhost:9200" ]

index => "pybbs"

document_type => "weblog"

    }

}

如果数据特别多,上述方案就会为Elasticsearch带来很大的压力。为了缓解Elasticsearch的压力,可以将Logstash收集的内容不直接输出到Elasticsearch中,而是输出到缓冲层,比如Redis或者Kafka,然后使用一个Logstash从缓冲层输出到Elasticsearch。当然,还有很多种方案进行日志收集,比如使用Filebeat替换Logstash等。笔者在生产环节搭建过ELK配置,这里提几点建议:

(1)根据日志量判断Elasticsearch的集群选择,不要盲目追求高可用,实际应用需要根据实际场景的预算等因素使用。

(2)缓冲层选择,一般来说选择Kafka和Redis。虽然Kafka作为日志消息很适合,具备高吞吐量等,但是如果需求不是很大,并且环境中不存在Kafka,就没有必要使用Kafka作为消息缓存层,使用现有的Redis也未尝不可。

(3)内存分配,ELK三者部署都是占有一定内存的,并且官网建议的配置都很大。建议结合场景来修改配置,毕竟预算是很重要的一环。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注