SpringBoot+ELK 搭建日志监控平台

ELK 简介

ELK(Elasticsearch, Logstash, Kibana)是一个目前主流的开源日志监控平台。由三个主要组件组成的:

Elasticsearch: 是一个开源的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,它构建在Lucene搜索引擎库之上,是当前使用较为广泛的开源搜索引擎之一。
Logstash: 一个用于收集、处理和转发日志数据的数据处理管道。Logstash可以从不同的日志源(如文件、应用程序日志、数据库等)中收集日志数据,并对其进行过滤、解析和转换,然后将其发送到Elasticsearch中进行存储和索引。
Kibana: 一个用于可视化和分析存储在Elasticsearch中的日志数据的用户界面。Kibana提供了一个直观且功能强大的仪表盘,可以根据特定需求创建各种图表、表格和地图,并进行实时数据可视化和监控。

安装Elasticsearch和Kibana

参考我之前写的博客

安装 Logstash

官方下载地址:https://www.elastic.co/cn/downloads/past-releases#logstash
与 Elasticsearch 一致

进入bin 目录,输入logstash.bat -e "input { stdin {} } output { stdout {} }"启动。
在这里插入图片描述

日志收集DEMO

创建SpringBoot应用

依赖导入

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

日志配置文件 logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 日志存放路径 --><property name="log.path" value="./logs"/><!-- 日志输出格式 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><!-- 是否在当天日志滚动时,对当天日志进行改名 --><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 系统错误日志输出 --><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><!-- 是否在当天日志滚动时,对当天日志进行改名 --><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 用户访问日志输出  --><appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-user.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统模块日志级别控制  --><logger name="com.project" level="info"/><!-- Spring日志级别控制  --><logger name="org.springframework" level="warn"/><root level="info"><appender-ref ref="console"/></root><!--系统操作日志--><root level="info"><appender-ref ref="file_info"/></root><root level="info"><appender-ref ref="file_error"/></root><!--系统用户操作日志--><logger name="sys-user" level="info"><appender-ref ref="sys-user"/></logger>
</configuration> 

启动类

创建Logstash配置文件

进入Logstash的config目录,创建一个名为 logstash.conf文件,并进行如下配置

input {#监控所有服务的error.log文件file {path => "F:/twj/mygitee/project/logs/sys-error.log"start_position => "beginning"sincedb_path => "E:/logstash-8.17.3/sincedb_error_file"codec => "plain"type => "error"}#监控所有服务的user.log文件file {path => "F:/twj/mygitee/project/logs/sys-user.log"start_position => "beginning"sincedb_path => "E:/logstash-8.17.3/sincedb_user_file"codec => "plain"type => "info"}}filter {# 使用 grok 解析日志内容grok {match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{DATA:thread} --- \[%{DATA:logger}\] \: %{GREEDYDATA:message}" }}# 如果需要从文件路径中提取服务名grok {match => { "path" => "logs/(?<service_name>[^/]+)/.*" }}# 时间字段转换为标准的时间格式date {match => [ "timestamp", "ISO8601" ]}# 过滤掉低于 ERROR 的日志(只保留 ERROR 日志)# if [loglevel] == "ERROR" {#   mutate {#     add_field => { "is_error_log" => "true" }#   }# }
}output {# 将 error 日志发送到 Elasticsearchif [type] == "error" {elasticsearch {hosts => ["http://localhost:9201"]index => "sys-error.log-%{+YYYY.MM.dd}"user => "elastic"password => "qD+=4WRHuM7JgmJVo-ZD"}}# 将 user 日志发送到 Elasticsearchif [type] == "info" {elasticsearch {hosts => ["http://localhost:9201"]index => "sys-user.log-%{+YYYY.MM.dd}"user => "elastic"password => "qD+=4WRHuM7JgmJVo-ZD"}}# 可选:你也可以将日志输出到文件(调试用)# file {#   path => "C:/path/to/output/logstash_output.json"# }
}

input部分: 定义了日志输入来源及其处理方式。配置中有两个 file 输入插件,用于读取不同的日志文件,*表示匹配该目录下的所有文件

  • path => “E:/work/sinosoft/logs/*/debug.log”: 这个配置指向所有子目录中的 debug.log 文件。
  • start_position => “beginning”: 从文件的开始位置开始读取。如果是首次读取,它会从文件开头读取。
  • sincedb_path => “E:/soft/ELK/logstash_sincedb/sincedb_debug_file”: sincedb 文件用于记录 Logstash 已经处理过的文件位置,确保在 Logstash 重启时能够继续读取未处理的日志。
  • codec => “plain”: 指定使用 plain 编解码器,即不对日志内容做任何特殊编码。
  • type => “debug”: 设置事件类型为 debug,用于后续在输出部分区分 debug 和 error 类型的日志。

filter部分: 用于对输入的日志数据进行解析和处理。

使用grok解析日志内容

  • 使用 grok 解析日志中的 message 字段,匹配日志的标准模式(例如时间戳、日志级别、线程、日志记录器、实际日志消息等)。

该表达式将日志分解为以下字段:

timestamp: 时间戳
loglevel: 日志级别(例如 INFO, ERROR 等)
thread: 线程名
logger: 日志记录器名
message: 实际的日志消息内容

  • 从日志的文件路径中提取服务名称,正则表达式 (?<service_name>[^/]+)/.* 会从路径
    logs/{service_name}/ 中提取 service_name 字段。
  • 将 timestamp 字段的时间格式转换为标准的时间格式(ISO8601),这样可以确保时间字段在 Elasticsearch
    中存储为正确的时间戳格式。
  • 过滤低于ERROR的日志,如果日志级别是 ERROR,则通过 mutate 插件给事件添加一个 is_error_log 字段,值为
    true,用于标识该事件是一个错误日志

output部分: 定义了日志最终的输出目标。

  • 输出debug类型的日志到Elasticsearch

  • 只有当事件的 type 字段为 debug 时,日志才会被发送到 Elasticsearch。

    hosts => [“http://localhost:9201”]: Elasticsearch 的地址。

    index => “sys-error.log-%{+YYYY.MM.dd}”: 日志会被索引到 sys-error.log-YYYY.MM.dd 这样的索引中,其中 %{+YYYY.MM.dd} 会自动替换为日志事件的年月(例如 2025.03.01)。

    user => “elastic”: Elasticsearch 用户名(一般为 elastic)。并且按日或按周等创建索引,将%{+YYYY.MM.dd}里面的+YYYY.MM.dd替换成其他便可。

  • 输出error类型的日志到Elasticsearch

  • 只有当事件的 type 字段为 error 时,日志才会被发送到 Elasticsearch。

  • index => “sys-error.log-%{+YYYY.MM.dd}”: 错误日志会被索引到
    sys-error.log-YYYY.MM.dd 这样的索引中。

调试用的文件输出,index => “sys-error.log-%{+YYYY.MM.dd}”: 错误日志会被索引到 sys-error.log-YYYY.MM.dd 这样的索引中。(可选)

索引创建频率:

根据配置,索引的创建是按月进行的。具体来说,索引名称为 sys-error.log-%{+YYYY.MM} 和 sys-error.log-%{+YYYY.MM},其中 %{+YYYY.MM} 会被替换为事件的年和月,因此每个月会自动创建一个新的索引。

例如,2025年3月1日的 debug 日志会被索引到 sys-user.log-2025.03.01,错误日志则会被索引到 sys-error.log-2025.03.01。

总结:

输入: 从多个文件中读取 debug.log 和 error.log,并根据文件路径设置不同的类型 (debug 和 error)。
过滤: 使用 grok 解析日志,提取必要的字段,并转换时间格式。只保留 ERROR 级别的日志。
输出: 根据日志类型,分别将 debug 和error 日志输出到不同的 Elasticsearch 索引中,索引按月创建。

这样配置的目的是将 debug 和 error 日志分开存储,便于查询和分析,并且确保日志的时间信息被标准化处理。

启动logstash

在将logstash.conf文件配置好并保存后,win+r打开终端(或者以管理员的方式),cd到bin目录下

在这里插入图片描述
输入命令:logstash.bat -f …/logstash-8.17.3/config/logstash.conf,启动logstash并且使用logstash.conf配置文件
在这里插入图片描述
在这里插入图片描述

启动成功后,logstash已经将配置文件中配置的将对应目录下的日志文件读入es中
在这里插入图片描述

配置kibana

1、选择Management

在这里插入图片描述

2、选择数据视图

在这里插入图片描述

3、创建数据视图

在这里插入图片描述

4、配置信息填写

在这里插入图片描述

日志查看

1、点击Discover 在这里插入图片描述

2、选择相应要查看的数据视图

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python36

仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。 # 先运行之前预处理好的代码 import pandas as pd import pandas as pd…

SGlang 推理模型优化(PD架构分离)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;广泛应用于搜索、内容生成、AI助手等领域&#xff0c;对模型推理服务的并发能力、响应延迟和资源利用效率提出了前所未有的高要求。与模型训练相比&#xff0c;推理是一个持续进行、资源消耗巨大的任务&#xff0c;尤…

模型实战(28)之 yolov5分类模型 训练自己的数据集

模型实战(28)之 yolov5分类模型 训练自己的数据集 本文以手写数字数据集为例总结YOLO分类模型如何训练自己的数据集,关于数据集的预处理可以看这篇:https://blog.csdn.net/yohnyang/article/details/148209978?spm=1001.2014.3001.5502 yolov5曾是在 2021-2023 年十分流行…

医学写作人才管理策略

1. 人才选择:精准定位核心能力 1.1 人才筛选标准 1.1.1 硬性要求 初创生物制药公司医学写作岗位对专业背景要求严格,候选人需具备医学、药学或生物学硕士及以上学历,博士优先。同时,熟悉ICH、FDA/EMA等法规指南是必备条件,且至少有1-3年医学写作经验,或相关领域如临床研…

Axure酒店管理系统原型

酒店管理系统通常被设计为包含多个模块或界面&#xff0c;以支持酒店运营的不同方面和参与者。其中&#xff0c;管理端和商户端是两个核心组成部分&#xff0c;它们各自承担着不同的职责和功能。 软件版本&#xff1a;Axure RP 9 预览地址&#xff1a;https://556i1e.axshare.…

云原生安全之HTTP协议:从基础到实战的安全指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念&#xff1a;HTTP协议的核心要素 HTTP&#xff08;HyperText Transfer Protocol&#xff09;是云原生应用中客户端与服务器通信的基础协议&a…

怎样解决photoshop闪退问题

检查系统资源&#xff1a;在启动 Photoshop 之前&#xff0c;打开任务管理器检查 CPU 和内存的使用情况。如果发现资源占用过高&#xff0c;尝试关闭不必要的程序或重启计算机以释放资源。更新 Photoshop 版本&#xff1a;确保 Photoshop 是最新版本。Adobe 经常发布更新以修复…

修复ubuntu server笔记本合盖导致的无线网卡故障

下班回到家发现走时还好的局域网 ubuntu server 24 连不上了&#xff0c;赶紧打开笔记本查看下原因&#xff0c;发现控制台出了一堆看不懂的内容&#xff1a; 根据搜索结果&#xff0c;笔记本合盖导致无线网卡故障可能与电源管理设置和系统休眠策略有关&#xff0c;以下是具体…

CMake指令:find_package()在Qt中的应用

目录 1.简介 2.Qt 核心组件与常用模块 3.配置模式的工作流程 4.完整示例&#xff1a;构建 Qt GUI 应用 5.常见问题与解决方案 6.总结 1.简介 在 CMake 中使用 find_package(Qt) 是集成 Qt 库的核心步骤。Qt 从 5.x 版本开始全面支持 配置模式&#xff08;Config Mode&…

Docker 镜像调试最佳实践

当你已经构建了一个 Docker 镜像&#xff0c;但运行它的容器启动后立即退出&#xff08;通常是因为服务异常或配置错误&#xff09;&#xff0c;你仍然可以通过以下几种方式进入镜像内部进行调试。 ✅ 最佳实践&#xff1a;如何对一个“启动即退出”的镜像进行命令行调试&#…

使用Java制作贪吃蛇小游戏

在这篇文章中&#xff0c;我将带你一步步实现一个经典的贪吃蛇小游戏。我们将使用Java语言和Swing库来构建这个游戏&#xff0c;它包含了贪吃蛇游戏的基本功能&#xff1a;蛇的移动、吃食物、计分以及游戏结束判定。 游戏设计思路 贪吃蛇游戏的基本原理是&#xff1a;玩家控制…

【linux】umask权限掩码

umask这个接口在一些程序初始化的时候经常会见到&#xff0c;处于安全性&#xff0c;可以缩小进程落盘文件的权限。 1、linux文件系统的权限规则 文件的默认权限由系统决定&#xff08;通常是 0666&#xff0c;即所有人可读可写&#xff09;。 目录的默认权限通常是 0777&am…

esp32cmini SK6812 2个方式

1 #include <SPI.h> // ESP32-C系列的SPI引脚 #define MOSI_PIN 7 // ESP32-C3/C6的SPI MOSI引脚 #define NUM_LEDS 30 // LED灯带实际LED数量 - 确保与实际数量匹配&#xff01; #define SPI_CLOCK 10000000 // SPI时钟频率 // 颜色结构体 st…

互联网大厂Java求职面试:Spring Cloud微服务架构设计中的挑战与解决方案

互联网大厂Java求职面试&#xff1a;Spring Cloud微服务架构设计中的挑战与解决方案 面试场景设定 郑薪苦是一位拥有丰富实战经验的Java开发者&#xff0c;他正在参加一场由某知名互联网大厂的技术总监主持的面试。这场面试将围绕Spring Cloud微服务架构展开&#xff0c;涵盖…

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…

# 使用 Hugging Face Transformers 和 PyTorch 实现信息抽取

使用 Hugging Face Transformers 和 PyTorch 实现信息抽取 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;信息抽取是一种常见的任务&#xff0c;其目标是从文本中提取特定类型的结构化信息。本文将介绍如何使用 Hugging Face Transformers 和 PyTorch 实现基于大…

Firecrawl MCP Server 深度使用指南

无论是市场分析师洞察行业动态、研究者收集学术资料&#xff0c;还是开发者为智能应用采集数据&#xff0c;都对网络数据采集工具提出了极高的要求。Firecrawl MCP Server 应运而生&#xff0c;它宛如一把犀利的 “数字手术刀”&#xff0c;能够精准地剖析网页&#xff0c;为用…

OceanBase数据库全面指南(基础入门篇)

文章目录 一、OceanBase 简介与安装配置指南1.1 OceanBase 核心特点1.2 架构解析1.3 安装部署实战1.3.1 硬件要求1.3.2 安装步骤详解1.3.3 配置验证二、OceanBase 基础 SQL 语法入门2.1 数据查询(SELECT)2.1.1 基础查询语法2.1.2 实际案例演示2.2 数据操作(INSERT/UPDATE/DE…

几种环境下的Postgres数据库安装

1. Postgres 数据库介绍 PostgreSQL&#xff08;又称 Postgres&#xff09;是一种强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它具备高度的可靠性、稳定性和可扩展性&#xff0c;主要特点如下&#xff1a; 开源&#xff1a;PostgreSQL 是基于开…

函数[x]和{x}在数论中的应用

函数[x]和{x}在数论中的应用 函数[x]和{x}的定义与基本性质&#xff08;定义1&#xff0c;命题1&#xff09;定义1例1命题1 函数[x]和{x}的应用&#xff08;定理1&#xff0c;推论1-推论3&#xff09;例2定理1注解5推论1例3例4推论2推论3命题2 函数[x]和{x}的定义与基本性质&am…