SpringBoot整合LogStash,LogStash采集服务器日志

LogStash

1. 下载

版本支持兼容表https://www.elastic.co/cn/support/matrix

版本: 7.16.x 的最后一个版本

https://www.elastic.co/downloads/past-releases/logstash-7-16-3

需要提前安装好jdk1.8和ES, 此处不在演示

在这里插入图片描述

2. 安装

tar -xvf logstash-7.16.3-linux-x86_64.tar.gz
cd logstash-7.16.3
touch logstash-my.conf

3.配置

分 inputs,filters、outputs三个主要配置

此处以以下配置为例,将服务器中的log日志推至ES中

# UAT
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.


input {
    file {
        path => ["/opt/javaproject/logs/all/*.log","/opt/javaproject/logs/all.log"]
    }
}
filter {

}

output {
  elasticsearch {
      action => "index"
      hosts  =>  "http://127.0.0.1:9200"
      user   =>  "elastic"
      password => "elastic"
      index  => "app-uat-log-%{+YYYY-MM-dd}"
  }

}

4.启动

在logstash 目录输入如下命令进行启动:

./bin/logstash -f logstash-test.conf

后台启动:

nohup ./bin/logstash -f logstash-test.conf >/dev/null 2>&1 &

热配置加载启动:

nohup ./bin/logstash -f logstash-test.conf --config.reload.automatic >/dev/null 2>&1 &

启动成功之后,如果是非后台启动,可以在控制台查看数据的传输,如果是后台启动,则可以在logstash的log目录中进行查看。

5.问题

1. SpringBoot整合logstash, 跟logstash直接监听log文件有何区别

Spring Boot 整合 LogstashLogstash 直接监听日志文件 是两种不同的日志采集方式,各有优劣,具体区别如下:


1. Spring Boot 整合 Logstash(主动推送)
原理

Spring Boot 项目通过 LogbackLog4j2 直接向 Logstash 发送日志数据,而不是依赖 Logstash 监听日志文件。

实现方式
  1. 使用 Logstash TCP/UDP 方式推送日志
    logback-spring.xml 配置 Logstash Appender:

    <configuration>
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>logstash-server:5044</destination>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
        </appender>
    
        <root level="info">
            <appender-ref ref="LOGSTASH" />
        </root>
    </configuration>
    
  2. 使用 ELK Stack 进行日志管理
    Logstash 监听 TCP 端口接收日志:

    input {
      tcp {
        port => 5044
        codec => json
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://es-server:9200"]
        index => "springboot-logs"
      }
    }
    
优缺点

实时性高:日志可以即时推送到 Logstash,延迟较低。
不会丢失日志:不会因为文件轮转导致日志缺失。
对应用影响较大:Spring Boot 需要主动推送日志,若 Logstash 不可用可能会影响应用运行。
部署复杂:需要修改 Spring Boot 日志配置,并保证 Logstash 端口可用。


2. Logstash 直接监听日志文件(被动采集)
原理

Spring Boot 只需按正常方式输出日志到文件,Logstash 监听该日志文件并读取数据推送到 Elasticsearch。

实现方式
  1. Spring Boot 配置日志输出到文件

    logging:
      file:
        name: logs/app.log
      level:
        root: info
    
  2. Logstash 配置监听文件

    input {
      file {
        path => "/path/to/logs/app.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://es-server:9200"]
        index => "springboot-logs"
      }
    }
    
优缺点

对应用无侵入:Spring Boot 只是正常写日志,不需要做额外改动。
更稳定:即使 Logstash 发生故障,Spring Boot 也不会受影响。
实时性稍差:Logstash 需要轮询日志文件,会有一定延迟。
日志文件轮转问题:如果日志文件滚动(log rotation),可能会丢失部分日志,需额外处理 sincedb


3. 两者的主要区别
方式实时性对 Spring Boot 影响部署难度可靠性
Spring Boot 整合 Logstash(推送)高(直接推送)需要修改日志配置,可能影响应用需要配置 Logstash 端口高(不会因文件丢失日志)
Logstash 监听日志文件(采集)略低(依赖文件变更)完全无侵入只需配置 Logstash 监听文件可能受 log rotation 影响

4. 什么时候选择哪种方式?
  • 如果你需要高实时性(如监控系统、异常报警) → 选择 Spring Boot 整合 Logstash,直接推送日志。
  • 如果你希望对 Spring Boot 无侵入,简单易用 → 选择 Logstash 监听日志文件,避免影响应用。
  • 如果你的应用是容器化(Docker / Kubernetes) → 推荐 Spring Boot 直接推送到 Logstash,因为容器日志文件管理不稳定。
  • 如果你的应用是传统部署(虚拟机/物理机)两种方式都可以,但监听文件方式可能更简单。
最佳实践

可以结合两者:

  • 应用运行时推送关键日志(错误日志、重要事件)到 Logstash,用于监控和报警。
  • 同时使用文件日志记录全部日志,并用 Logstash 监听日志文件,用于历史查询。

这种方式既能保证实时性,又不会因为 Logstash 故障导致日志丢失。

### 回答1: Spring Boot可以很方便地与Logstash进行整合,实现日志的收集和分析。具体步骤如下: 1. 在pom.xml中添加logstash-logback-encoder依赖: ```xml <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.6</version> </dependency> ``` 2. 在application.properties中配置logstash的地址和端口: ```properties logging.logstash.url=http://localhost:5044 ``` 3. 在logback.xml中配置logstash的appender: ```xml <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${logging.logstash.url}</destination> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> ``` 4. 在logger中添加logstash的appender: ```xml <logger name="com.example" level="INFO"> <appender-ref ref="logstash" /> </logger> ``` 5. 启动Logstash服务,配置Logstash的input和output: ```conf input { tcp { port => 5044 codec => json_lines } } output { elasticsearch { hosts => ["localhost:920"] index => "logstash-%{+YYYY.MM.dd}" } } ``` 6. 启动Spring Boot应用程序,日志将被发送到Logstash服务器进行处理和存储。 以上就是Spring Boot整合Logstash的基本步骤,可以根据实际需求进行调整和优化。 ### 回答2: 前置知识 在回答这个问题之前,需要了解一些关于 Spring Boot、ELK Stack 和 Logstash 的概念。 Spring Boot 是一个快速开发框架,它使得创建和配置 Spring 应用程序变得更加容易。它提供了一整套基础设施,包括 Web、安全、数据、缓存等。 ELK Stack 是 Elastic Stack 中的一部分,它是一个开源的日志分析平台。ELK Stack 由 Elasticsearch、Logstash 和 Kibana 三个组件构成,它们协同工作来收集、存储、分析和可视化日志数据。 Logstash 是 ELK Stack 中一个用于日志管理和处理的工具,它能够将不同的数据源中的日志数据收集起来,并转换成统一的格式进行处理。 回答 在 Spring Boot 应用程序中,我们可以使用 Logstash 来收集和分析日志信息。下面是整合步骤: 1、在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.6</version> </dependency> ``` 这个 logstash-logback-encoder 依赖提供了 Logback 的 Encoder 接口的实现,可以将日志信息转换为 Logstash 格式。 2、在 logback.xml 中配置 logstash 输出: ``` <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:4560</destination> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> ``` 这个配置会创建一个 LogstashTcpSocketAppender 实例,收集日志信息并发送到指定的地址。在 encoder 中指定 LogstashEncoder,将日志信息转换成 Logstash 事件格式。 3、在 application.properties 文件中配置 logstash 输出: ``` logging.level.root=debug logging.file=app.log logging.config=classpath:logback.xml logstash.host=localhost logstash.port=4560 ``` 在 application.properties 配置中,我们指定了日志级别、日志文件名称、logback 的配置文件路径以及 Logstash 的地址和端口号。 使用以上步骤整合 Spring BootLogstash 后,我们就可以通过 Logstash 所提供的可视化界面(Kibana)对日志信息进行分析和呈现了。 ### 回答3: Spring BootLogstash是两款非常流行的开源工具,Spring Boot是一个轻量级的Java框架;而Logstash则是一个用于收集、处理和转发日志的数据管道工具。将Spring BootLogstash结合起来,可以让开发者更方便地收集、过滤、聚合和存储日志数据。 首先,需要在pom.xml文件中添加Logstash依赖(请确保版本匹配): ``` <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.3</version> </dependency> ``` 然后,在application.properties文件中配置Logstash服务器的主机名和端口号: ``` # Logstash spring.logstash.host=logstash-server spring.logstash.port=5000 ``` 接下来,我们需要在logback.xml文件中配置Logback的日志输出格式,以及将日志发送到Logstash服务器。例如,我们可以使用JSON格式输出日志: ``` <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${spring.logstash.host}:${spring.logstash.port}</destination> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp/> <message/> <logLevel/> <loggerName/> </providers> </encoder> </appender> <root level="INFO"> <appender-ref ref="logstash" /> </root> </configuration> ``` 至此,Spring Boot的应用程序已经可以向Logstash服务器发送日志消息了。我们可以在Logstash服务器上使用Elasticsearch、Kibana等工具对日志进行存储、搜索和可视化。例如,可以使用以下Logstash配置将日志数据发送到Elasticsearch中: ``` input { tcp { port => 5000 codec => json_lines } } output { elasticsearch { hosts => ["localhost:9200"] index => "my-log-%{+YYYY.MM.dd}" } } ``` 通过这种方式,我们就可以实现Spring Boot应用程序和Logstash之间的集成。这种集成方式可以让我们更容易地对日志进行管理、分析和监控,从而提高应用程序的可靠性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值