【超详细】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: 8080

spring:
  application:
    name: springboot-log-logstash-logback-demo
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

# 日志配置
logging:
  level:
    org.springframework: warn
  config: 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 => 4560
    codec => json
    type => "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 => 4560
    codec => json
    type => "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 }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索Linux中的进程控制:从启动到退出的背后原理

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分&#xff0c;保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例&#xff1a; https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

推箱子游戏

java小游戏2 一游戏介绍 二图像准备 墙、箱子、人、箱子目的地&#xff0c;人左边、人右边、人上边、人下边 三结构准备 地图是什么&#xff0c;我们把地图想象成一个网格&#xff0c;每个格子就是工人每次移动的步长&#xff0c;也是箱子移动的距离&#xff0c;设置一个二维数…

软件鉴定测试重要性和流程分享

在当今快速发展的数字时代&#xff0c;软件系统的可靠性和安全性变得至关重要。越来越多的企业意识到&#xff0c;进行专业的软件鉴定与测试不仅是保证产品质量的必要步骤&#xff0c;也是提升市场竞争力的重要手段。软件鉴定测试指通过对软件进行评估和验证&#xff0c;以确保…

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Linu…

15-spring整合mybatis方式一

spring整合mybatis 方式一【重要】 步骤: 1.导入相关jar包 junit mybatis mysql数据库 spring相关的 aop织入 mybatis-spring 【new】 junit junit 4.12 mysql mysql-connector-java 8.0.23 org.mybatis mybatis 3.5.2 org.springframework spring-webmvc 5…

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框&#xff08;QMessageBox&#xff09;和对话框&#xff08;QDialog&#xff09;&#xff0c;比如对话框用于用户名和密码输入&#xff0c;消息框用于提示登录成功、密码错误。 • 基础知识&#xff1a;PySide6&#xff08;PyQT5&#xff09;的常用对话…

什么是COLLATE排序规则?

在当今数字化世界中&#xff0c;数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中&#xff0c;我们经常需要对字符串进行排序&#xff0c;以展示或处理信息。为了实现这一点&#xff0c;各种系统和工具提供了排序规则&#xff0c;其中COLLATE排序规则就是其中的一…

Linux:信号的保存[2]

1.信号在内核中的表示 因为是三种内核的数据结构&#xff0c;操作系统就可以通过操作这些数据结构提供接口。 如果一个信号没有产生&#xff0c;并不妨碍它可以先被阻塞。 当同一时刻发送大量相同信号时&#xff0c;会丢失。 2.信号的捕捉&#xff08;重点&#xff09; 信号产…

顺序表和链表(详解)

线性表 线性表&#xff08; linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

【电脑无法通过鼠标和键盘唤醒应该怎么办】

【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 动态规划思想第一步&#xff1a;描述状态~ dp[i][j]&#xff1a;表示走到i&#xff0c;j位置时&#xff0c;一共有多少种方法~ 动态规划思想第二步&#xff1a;状态转移方程~ 动态规划思想第三步&#xf…

vue + element-ui 组件样式缺失导致没有效果

失效 代码&#xff1a; 修改方法&#xff1a; 在main.js文件里面加上&#xff1a; import element-ui/lib/theme-chalk/index.css; 最后&#xff1a;

Go 切片:用法和本质

要想更好的了解一个知识点&#xff0c;实战是最好的经历。 题目 我这里放一道题目&#xff1a; package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

基于Spark的共享单车数据存储系统的设计与实现_springboot+vue

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

在Unity中使用大模型进行离线语音识别

文章目录 1、Vosk下载下载vosk-untiy-asr下载模型在项目中使用语音转文字音频转文字2、whisper下载下载unity项目下载模型在unity中使用1、Vosk 下载 下载vosk-untiy-asr Github链接:https://github.com/alphacep/vosk-unity-asr 进不去Github的可以用网盘 夸克网盘链接:h…

【计算机网络】- 应用层HTTP协议

目录 初识HTTP 什么是HTTP 版本 HTTPS 模型 HTTP抓包工具 为什么使用 抓包工具的下载 下载后的重要操作 Fiddler的使用 HTTP请求与响应的基本格式 HTTP请求基本格式​编辑 HTTP响应基本格式 协议格式总结❗️❗️❗️​编辑 HTTP 详解 认识 URL URL基本格式 …

记一次IDOR 和访问控制缺失漏洞挖掘

视频教程在我主页简介和专栏里 测试 IDOR&#xff08;不安全的直接对象引用&#xff09; 漏洞时&#xff0c;我会使用一系列工具&#xff0c;确保不会遗漏任何问题。以下是我的测试方法&#xff1a; 设置 Firefox 和 Pwnfox&#xff1a; 1、我使用 Firefox 浏览器&#xff0c…

GS论文阅读--Hard Gaussian Splatting

前言 本文也是对高斯点云的分布进行优化的&#xff0c;看&#xff01; 文章目录 前言1.背景介绍2.关键内容2.1 位置梯度驱动HGS2.2 渲染误差引导HGS 3.文章贡献 1.背景介绍 在训练过程中&#xff0c;它严重依赖于视图空间位置梯度的平均幅度来增长高斯以减少渲染损失。然而&…