当前位置: 首页 > news >正文

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志

日志流程

logfile-> logstash -> es -> kibana 进行展示

ELK环境安装(docker)

Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器

Logstash实现日志文件的采集

本示例进行采集nginx日志进行演示。

1. logstash配置文件内容:

位于:/data/docker/logstash/config/logstash.conf

input {# 监听nginx日志file {path => ["/data/docker/nginx/logs/access.log", "/data/docker/nginx/logs/error.log"]type => "nginx_log" # 自定义类型start_position => "beginning" # beginning-从头开始 end-从结束不配置默认读取最新的数据,默认end}
}filter {# nginx日志格式配置if [type] == "nginx_log" {grok {match => { "message" => "%{COMBINEDAPACHELOG}"} # 标准日志格式}date {match => [ "timestamp", "ISO8601", "yyyy/MM/dd HH:mm:ss" ] # 增加ISO8601支持更多日期格式target => "@timestamp"}mutate {add_field => { "[@metadata][app]" => "%{type}" }}}}output {elasticsearch {hosts => ["elasticsearch:9200"]index => "%{[@metadata][app]}-%{+YYYY.MM.dd}"}
}

2. 修改完配置后,进行重启logstash

kibana配置索引模式,用于在kibana中进行查看日志

1. 检查配置的日志是否被采集到

进入Index Management中查看是否含有nginx_log-yyyy-MM-dd 的index,如果有说明日志被正常采集到了。

菜单位于左侧菜单栏的Management->Stack Management->Index Management中
在这里插入图片描述
在这里插入图片描述

2. 设置索引模式

在 Index patterns页面中进行新增索引模式,输入nginx_log*进行模糊匹配到我们的nginx日志索引,然后选择timestamp点击确定即可生成日志看板。然后在Discover页面中就能看到我们配置的日志面板了。

菜单位于左侧菜单栏的Management->Stack Management-> Index patterns

  • 创建新的索引模式
    在这里插入图片描述
  • 输入索引名称进行模糊匹配
    在这里插入图片描述
  • 第二步骤选择timestamp
    在这里插入图片描述

3. 进入到Discover页面进行查看日志

在这里插入图片描述

  • 下拉找到nginx_log*,就能看到采集到的日志了
    在这里插入图片描述

SpringBoot 服务上报给Logstash

该示例使用的springboot自带的logback日志框架进行上报给logstash。

如使用log4j日志框架的可以参考我写的另外一个文章: springboot 集成log4j日志,需要自定义json格式内容输出方便ES采集

springboot项目demo

GITEE项目:springboot实现logstash日志上报

pom依赖


<properties><java.version>1.8</java.version><lombok.version>1.18.28</lombok.version><fastjson2.version>2.0.34</fastjson2.version><junit.version>4.13.2</junit.version><logstash.version>7.2</logstash.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version>
</dependency><!-- fastjson2 -->
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>${fastjson2.version}</version>
</dependency><!-- logstash -->
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>${logstash.version}</version>
</dependency></dependencies>

yaml配置


server:port: 8080spring:application:name: springboot-log-logstash-logback-demojackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8default-property-inclusion: non_null# 日志配置
logging:level:org.springframework: warnconfig: classpath:logback-spring.xml# logstash 配置logstash:url: 127.0.0.1:4560

注意:需要文件名需要为logback-spring.xml ,不然在配置日志参数时,会报错无法获取到yaml的配置

logback-spring.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><property name="log.path" value="/data/logs/springboot-log-logback-demo"/><property name="console.log.pattern"value="%green(%d{yyyy-MM-dd HH:mm:ss}) %highlight([%level]) %boldMagenta(${PID}) --- %green([%thread])  %boldMagenta(%class) - [%method,%line]: %msg%n"/><property name="log.pattern"value="%d{yyyy-MM-dd HH:mm:ss} [%level] ${PID} --- [%thread] %class - [%method,%line]: %msg%n"/><springProperty name="LOG_STASH_URL" scope="context" source="logging.logstash.url" defaultValue="127.0.0.1:4560"/><springProperty name="app" scope="context" source="spring.application.name" defaultValue="springboot-server"/><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${console.log.pattern}</pattern><charset>utf-8</charset></encoder></appender><appender name="file_out" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/out.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/out.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>10</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level></filter></appender><appender name="async_out" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><queueSize>512</queueSize><appender-ref ref="file_out"/></appender><!-- Logstash --><appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>${LOG_STASH_URL}</destination><!-- logstash默认输出格式  --><!-- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"><customFields>{"app":"${app}"}</customFields><pattern>${log.json.pattern}</pattern></encoder>--><!-- 自定义logstash输出格式 - json--><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><pattern><pattern>{"app":"${app}","timestamp": "%d{MM-dd HH:mm:ss.SSS}","level": "%level","class": "%class","method": "%method","line": "%class#%method - %line","message": "%msg","header.client-ip": "%X{header.client-ip}","header.content-length": "%X{header.content-length}","thread": "%thread","stack_trace": "%exception{10}"}</pattern></pattern></providers></encoder></appender><root level="info"><appender-ref ref="console"/><appender-ref ref="async_out"/><appender-ref ref="logstash"/></root></configuration>

logstash配置文件内容

# 采集配置input {# 设置监听端口为4560,格式为json格式tcp {mode => "server"host => "0.0.0.0"port => 4560codec => jsontype => "json_log"  # 自定义类型标识}
}filter {# json 格式 设置app名称,用于定义index索引名称if [type] == "json_log" {mutate {copy => { "app" => "[@metadata][app]" }}}}output {elasticsearch {hosts => ["elasticsearch:9200"]index => "%{[@metadata][app]}-%{+YYYY.MM.dd}"}# 输出到控制台以便调试# stdout { codec => rubydebug }
}

kibana配置日志查看↑和nginx的配置一样

在这里插入图片描述

logstash多文件配置

# 采集配置input {# 设置监听端口,格式为json格式tcp {mode => "server"host => "0.0.0.0"port => 4560codec => jsontype => "json_log"  # 自定义类型标识}# 监听nginx日志file {path => ["/data/docker/nginx/logs/access.log", "/data/docker/nginx/logs/error.log"]type => "nginx_log" # 自定义类型start_position => "beginning" # beginning-从头开始 end-从结束不配置默认读取最新的数据,默认end}
}filter {# json 格式 设置app名称,用于定义index索引名称if [type] == "json_log" {mutate {copy => { "app" => "[@metadata][app]" }}}# nginx日志格式配置if [type] == "nginx_log" {grok {match => { "message" => "%{COMBINEDAPACHELOG}"} # 标准日志格式}date {match => [ "timestamp", "ISO8601", "yyyy/MM/dd HH:mm:ss" ] # 增加ISO8601支持更多日期格式target => "@timestamp"}mutate {add_field => { "[@metadata][app]" => "%{type}" }}}}output {elasticsearch {hosts => ["elasticsearch:9200"]index => "%{[@metadata][app]}-%{+YYYY.MM.dd}"}# 输出到控制台以便调试# stdout { codec => rubydebug }
}

相关文章:

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍&#xff0c;Logstash进行自动采集服务器日志文件&#xff0c;并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式&#xff0c;可以在kibana中看到采集到的日志 日志流程 logfile-> l…...

微信阅读网站小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

通过配置核查,CentOS操作系统当前无多余的、过期的账户;但CentOS操作系统存在共享账户r***t

通过配置核查,CentOS操作系统当前无多余的、过期的账户;但CentOS操作系统存在共享 核查CentOS操作系统中的用户账户&#xff0c;可以使用以下命令&#xff1a; 查看当前活跃用户&#xff1a; awk -F: /\$1\$/{print $1} /etc/shadow 查看多余账户&#xff08;非活跃账户&…...

Vue 3 30天精进之旅:Day 05 - 事件处理

引言 在前几天的学习中&#xff0c;我们探讨了Vue实例、计算属性和侦听器。这些概念为我们搭建了Vue应用的基础。今天&#xff0c;我们将专注于事件处理&#xff0c;这是交互式Web应用的核心部分。通过学习如何在Vue中处理事件&#xff0c;你将能够更好地与用户进行交互&#…...

.NET Core跨域

CORS 跨域通讯的问题。解决方案&#xff1a;JSONP、前端代理后端请求、CORS等。CORS原理&#xff1a;在服务器的响应报文头中通过access-control-allow-origin告诉浏览器允许跨域访问的域名。在Program.cs的“var appbuilder.Build()”这句代码之前注册 string[] urls new[] …...

笔试-二维数组2

应用 现有M(1<M<10)个端口组&#xff0c;每个端口组是长度为N(1<N<100)&#xff0c;元素均为整数。如果这些端口组间存在2个及以上的元素相同&#xff0c;则认为端口组可以关联合并&#xff1b;若可以关联合并&#xff0c;请用二位数组表示输出结果。其中&#xf…...

vue中使用jquery 实现table 拖动改变尺寸

使用 CDN , 降低打包文件的大小在index.html中 <script src"https://.../cdns/jquery-1.12.4.min.js"></script>在 Vue 中使用 jQuery 一旦你引入 jQuery&#xff0c;你可以在 Vue 实例中使用它。有两种主要方式&#xff1a; 1. 使用全局变量 $ jQue…...

使用ensp进行ppp协议综合实验

实验拓扑 实验划分 AR1的Serial3/0/0接口&#xff1a;192.168.1.1/24&#xff1b; AR2的Serial3/0/0接口&#xff1a;192.168.1.2/24&#xff1b; AR2的Serial3/0/1和4/0/0的聚合接口&#xff1a;192.168.2.2/24&#xff1b; AR3的Serial3/0/0和3/0/1的聚合接口&#xff1a;192…...

什么是AGI

AGI&#xff08;Artificial General Intelligence&#xff0c;人工通用智能&#xff09;是指具备与人类相当或超越人类水平的通用智能的人工智能系统。与当前主流的**狭义人工智能&#xff08;Narrow AI&#xff09;**不同&#xff0c;AGI 能够像人类一样灵活地处理各种任务&am…...

RabbitMQ模块新增消息转换器

文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…...

验证二叉搜索树(力扣98)

根据二叉搜索树的特性&#xff0c;我们使用中序遍历&#xff0c;保证节点按从小到大的顺序遍历。既然要验证&#xff0c;就是看在中序遍历的条件下&#xff0c;各个节点的大小关系是否符合二叉搜索树的特性。双指针法和适合解决这个问题&#xff0c;一个指针指向当前节点&#…...

vue3 vue2区别

Vue 3 和 Vue 2 之间存在多个方面的区别&#xff0c;以下是一些主要的差异点&#xff1a; 1. 性能改进 Vue 3&#xff1a;在性能上有显著提升&#xff0c;包括更小的包体积、更快的渲染速度和更好的内存管理。Vue 2&#xff1a;性能相对较低&#xff0c;尤其是在大型应用中。…...

IOS 自定义代理协议Delegate

QuestionViewCell.h文件代码&#xff0c;定义代理协议 protocol QuestionViewCellDelegate <NSObject>- (void)cellIsOpenDidChangeAtIndexPath:(NSIndexPath *)indexPath;endinterface QuestionViewCell : UITableViewCellproperty (nonatomic, weak) id<QuestionVi…...

消息队列篇--扩展篇--码表及编码解码(理解字符字节和二进制,了解ASCII和Unicode,了解UTF-8和UTF-16,了解字符和二进制等具体转化过程等)

1、理解字符&#xff0c;int&#xff0c;字节以及二进制存储 &#xff08;1&#xff09;、字符 字符是文本的基本单位&#xff0c;例如字母&#xff08;A, B, C&#xff09;、数字&#xff08;1, 2, 3&#xff09;、标点符号&#xff08;!, ?, ,&#xff09;以及其他符号&am…...

2024年度总结——理想的风,吹进现实

2024年悄然过去&#xff0c;留下了太多美好的回忆&#xff0c;不得不感慨一声时间过得真快啊&#xff01;旧年风雪尽&#xff0c;新岁星河明。写下这篇博客&#xff0c;记录我独一无二的2024年。这一年&#xff0c;理想的风终于吹进现实&#xff01; 如果用一句话总结这一年&am…...

代码工艺:实践 Spring Boot TDD 测试驱动开发

TDD 的核心理念是 “先写测试&#xff0c;再写功能”&#xff0c;其过程遵循一个严格的循环&#xff0c;即 Red-Green-Refactor&#xff1a; TDD 的流程 1. Red&#xff08;编写失败的测试&#xff09; 根据需求&#xff0c;先编写一个测试用例&#xff0c;描述期望的行为。…...

深度学习|表示学习|卷积神经网络|通道 channel 是什么?|05

如是我闻&#xff1a; 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;channel&#xff08;通道&#xff09; 是指输入或输出数据的深度维度&#xff0c;通常用来表示输入或输出的特征类型。 通道的含义 输入通道&#xff08;Input Channels&#xff09;&#xff1a;…...

PCDN的虚拟机与云主机区别

使用虚拟机和云主机运行PCDN&#xff08;P2P CDN&#xff09;时&#xff0c;主要存在以下区别&#xff1a; 一、资源分配与灵活性 虚拟机&#xff1a; 资源受限&#xff1a;虚拟机运行在物理服务器上&#xff0c;其资源&#xff08;如CPU、内存、带宽&#xff09;受到物理服务…...

计算机网络 (57)改进“尽最大努力交付”的服务

前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端&#xff0c;而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记&#xff1a; 给不同性质的分组打上不同的标记&#x…...

Redis 详解

简介 Redis 的全称是 Remote Dictionary Server&#xff0c;它是一个基于内存的 NoSQL&#xff08;非关系型&#xff09;数据库&#xff0c;数据以 键值对 存储&#xff0c;支持各种复杂的数据结构 为什么会出现 Redis&#xff1f; Redis 的出现是为了弥补传统数据库在高性能…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...