ELK日志服务收集SpringBoot日志案例

news2024/12/26 22:06:20

第一步:准备docker-compose文件

  1. 首先准备 docker-compose.yaml 文件
version: "3"
services:
  elasticsearch:
    image: elasticsearch:7.17.2
    container_name: elasticsearch-server
    networks:
      - host
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
    volumes:
      - /vault/app/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /vault/app/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.17.2
    container_name: kibana-server
    networks:
      - host
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.17.2
    container_name: logstash-server
    networks:
      - host
    volumes:
      - /vault/app/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    ports:
      - 4560:4560
networks:
  host:

第二步:准备目录

  1. 首先在需要安装ELK的目录下创建几个目录,我是在 /opt/app/
mkdir /elk
mkdir /elk/elasticsearch
mkdir /elk/elasticsearch/data
mkdir /elk/elasticsearch/plugins
mkdir /elk/logstash
mkdir /elk/logstash/pipeline
  1. 在 /elk/logstash/pipeline 目录下创建logstash.conf文件
# 输入环境配置
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}

# 输出环境配置
output {
  # 输出到控制台
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    hosts => "es:9200"
    user => "elastic"
    password => "bmallelasticsearch"
    index => "logstash-%{[spring.application.name]}-%{+YYYY.MM.dd}"
  }
}

第三步:执行安装脚本

  1. 执行安装命令
docker-compose up -d
  1. 拉去缓慢,或者遇到下面异常
    在这里插入图片描述

第四步:docker pul 延迟处理

  1. 解决方案
  • 修改配置文件:
vim /etc/docker/daemon.json
  • 配置以下内容
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": true,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [
    "172.24.86.231"
  ],
  "registry-mirrors": [
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "log-driver":"json-file",
  "log-opts": {
    "max-size":"500m", 
    "max-file":"3"
  }
}
  • 输入输入:wq保存并退出
  1. docker重启
sudo systemctl daemon-reload

sudo systemctl restart docker
  1. 查看
docker info
  1. 滑倒最下面
    在这里插入图片描述

第五步:重新安装

  1. 重新执行安装命令
docker-compose up -d
  1. 安装启动成功
    在这里插入图片描述

第六步:防火墙

  1. 开放端口
 firewall-cmd --zone=public --add-port=5601/tcp --permanent
 firewall-cmd --zone=public --add-port=9200/tcp --permanent 
 firewall-cmd --zone=public --add-port=4560/tcp --permanent 
  1. 重启防火墙
 firewall-cmd --reload

第七步:验证ES是否安装成功

  1. 浏览器访问 IP:9200
    在这里插入图片描述

第八步:验证Kibana是否安装成功

  1. 浏览器访问 IP:5601
    在这里插入图片描述
    首次进来发现什么都没有
    在这里插入图片描述

第九步:Logstash收集SpringBoot 项目日志案例

  1. 创建项目测试,首先创建一个SpringBoot项目

  2. maven 的配置

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>
 <!-- 日志推送 -->
 <dependency>
     <groupId>net.logstash.logback</groupId>
     <artifactId>logstash-logback-encoder</artifactId>
     <version>7.2</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>
  1. 创建一一个接口

@Slf4j
@RestController
public class EndPointController {

    @GetMapping("/endpoint")
    public String endpoint() throws NoSuchAlgorithmException {
        SecureRandom random = SecureRandom.getInstanceStrong();
        int guessLogTimes = random.nextInt(10);
        for (int i = 0; i < guessLogTimes; i++) {
            log.info("The {} Business is start now !", i + 1);
            log.info("The {} Business is doing now !", i + 1);
            log.info("The {} Business is end now !", i + 1);
        }
        log.error("我是错误error日志哦!!!!");
        return "Times log Success" + guessLogTimes;
    }
}
  1. 启动

@SpringBootApplication
public class SysLogApplication {

    public static void main(String[] args) {
        SpringApplication.run(SysLogApplication.class, args);
    }

}
  1. 日志配置
    logback-spring.xml
<?xml version="1.0" encoding="utf-8"?>
 <configuration>
     <!-- 控制台日志输出 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <layout class="ch.qos.logback.classic.PatternLayout" >
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %m%n</pattern>
         </layout>
     </appender>
 
     <!-- 指定日志索引前缀 -->
     <!-- 因为安装logstash的时候已经在 logstash.conf配置中指定了格式 -->
     <!-- logstash-%{[spring.application.name]}-%{+YYYY.MM.dd} -->
     <!-- 最终日志文件索引的名称为:logstash-bmall11111-sys-log-2024.08.07 -->

     <!-- bmall11111 为自定义前缀名称 sys-log 为服务名称 -->
     
     <property name="indexPrefix" value="bmall11111"/>
     <!-- 获取服务名称 -->
     <springProperty scope="context" name="appName" source="spring.application.name"/>
 
     <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
         <!--可以访问的logstash日志收集端口-->
         <destination>139.196.86.102:4560</destination>
         <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
             <customFields>{"spring.application.name":"${indexPrefix}-${appName}"}</customFields>
         </encoder>
     </appender>
 
 
     <root level="INFO">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="logstash"/>
     </root>
 </configuration>
  1. 打开高级设置
    在这里插入图片描述
  2. 索引管理,查看索引
    在这里插入图片描述
  3. 创建Index patterns

在这里插入图片描述
在这里插入图片描述
9. 筛选
在这里插入图片描述

第十步:许可证安装【7.x以上版本可跳过】

  1. 注册elasticsearch账号,注册地址 https://register.elastic.co/
    在这里插入图片描述
  2. 邮件下载许可证
    在这里插入图片描述

附:logback-spring.xml获取application.yml配置

1. application.yml

server:
  port: 8080
  tomcat:
    uri-encoding: UTF-8
    accept-count: 1000
    threads:
      max: 800
      min-spare: 100
    max-http-form-post-size: 8MB

spring:
  application:
    name: demo-server
  mvc:
    pathMatch:
      matching-strategy: ant_path_matcher
  # 环境切换
  profiles:
    active: @activatedProperties@

# 接口文档
knife4j:
  enable: true
  # 开启生产环境屏蔽
  production: false

2. application-dev.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/demo_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: xxxx
    hikari:
      connection-test-query: SELECT 1
      minimum-idle: 5
      maximum-pool-size: 20
      pool-name: bili-pool

# logback-spring.xml 日志配置 开发环境
logstash:
  path: /tmp/logs/demo-logs
  host: 127.0.0.1
  port: 4560

3. application-prod.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/demo_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: xxxx
    hikari:
      connection-test-query: SELECT 1
      minimum-idle: 5
      maximum-pool-size: 20
      pool-name: bili-pool

# logback-spring.xml 日志配置 生产环境
logstash:
  path: /opt/app/demo-logs/logs
  host: 127.90.10.123
  port: 4560

4. logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 从Spring的Environment中读取自定义属性 -->
    <springProperty scope="context" name="host" source="logstash.host"/>
    <springProperty scope="context" name="port" source="logstash.port"/>
    <springProperty scope="context" name="path" source="logstash.path"/>
    <springProperty scope="context" name="server_name" source="spring.application.name"/>
   
    <!-- 日志存放路径 -->
    <property name="log.path" value="${path}"/>

    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!-- 控制台日志输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <layout class="ch.qos.logback.classic.PatternLayout" >
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
        </layout>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${server_name}-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/${server_name}-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <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}/${server_name}-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/${server_name}-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 获取服务名称 -->
    <springProperty scope="context" name="appName" source="spring.application.name"/>

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>${host}:${port}</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"spring.application.name":"${appName}"}</customFields>
        </encoder>
    </appender>

    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="logstash"/>
    </root>

</configuration>

5. maven

 <!-- 环境切换 -->
  <profiles>
    <profile>
      <id>dev</id>
      <properties>
        <activatedProperties>dev</activatedProperties>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>
    <profile>
      <id>prod</id>
      <properties>
        <activatedProperties>prod</activatedProperties>
      </properties>
    </profile>
  </profiles>

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

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

相关文章

NeRF原理学习

一个2020年的工作我现在才来学习并总结它的原理&#xff0c;颇有种“时过境迁”的感觉。这篇总结是基于NeRF原文 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 阅读理解后写的&#xff0c;作用是以后如果记不太清了可以回忆。 目的&应用 先说…

80.动态申请内存

目录 一.malloc函数 二.其他注意事项 三.视频教程 在定义变量的时候会在内存中申请空间。除了在定义变量的时候申请内存空间&#xff0c;也可以使用库函数动态申请内存&#xff0c; 一.malloc函数 作用&#xff1a;动态申请一块连续的任意尺寸的内存空间。 函数原型&…

【前端9】手风琴v1.0版本:使用插槽实现动态内容插入的Vue组件

【前端9】手风琴&#xff1a;使用插槽实现动态内容插入的Vue组件 写在最前面一、插槽的基本概念1.默认插槽2.具名插槽 二、实现一个折叠面板组件0.关键点和注意事项1.父组件 App.vue2.子组件 Collapse.vue总结 3.详细解读&#xff08;可以略过&#xff09;父组件子组件 三、小结…

通用后台管理系统实战演示(Vue3 + element-plus)汇总篇三

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Python任务编排和工作流管理库之prefect使用详解

概要 在数据工程和科学的世界中,任务编排和工作流管理变得越来越重要。随着数据处理任务的复杂性增加,开发人员需要一种可靠且易于使用的工具来设计、监控和管理这些任务。Prefect 是一个用于构建、监控和管理数据管道的 Python 库,它简化了工作流的创建和执行,同时提供了…

028、架构_高可用_主从原理

MySQL半同步复制概览 MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。主从复制的基本过程如下图所示: 主从复制的完成通过以下三个进程实现的主库 binary log dump 线程:当从库连接主库时,…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes1. [官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

【科研新手必备】如何高效、高质量、科学的科研?

文献下载网站—英文写作小工具—SCI选刊 1、文献下载网站 中国知网 sci-hub 大木虫学术导航 学术资源搜索 2、英文写作小工具 DeepL 学术短语库 SCI写作辅导材料 赛特新思 3、SCI选刊 Journal Finder SPRINGER NATURE

除了黑神话,探索3A游戏大作:不可错过的经典与录屏软件推荐

在游戏的天地里&#xff0c;3A 大作凭借其美轮美奂的画面、丰富多彩的内容以及意蕴深邃的剧情&#xff0c;俘获了无数玩家的倾心。除了广受瞩目的《黑神话&#xff1a;悟空》&#xff0c;还有诸多其他的 3A 游戏大作值得您去尝试。此类游戏不但在视觉与技术方面臻至行业的巅峰水…

Linux中如何查看一个进程?如何杀死一个进程?如何查看某个端口有没有被占用?

在Linux中 如何查看一个进程&#xff1f; 使用 ps 命令 ps aux这会显示所有正在运行的进程&#xff0c;可以使用 grep 来过滤特定的进程 ps aux | grep process_name使用 top 命令 top这个命令会实时的显示系统重正在运行的进程 如何杀死一个进程&#xff1f; 使用 kill …

C++ | 泛型编程:模板初阶与函数模板深度解析

文章目录 C 泛型编程&#xff1a;模板初阶与函数模板深度解析1. 泛型编程&#xff1a;实现代码的通用性2. 函数模板&#xff1a;代码的模具2.1 什么是函数模板&#xff1f;2.2 函数模板的格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板&#xff…

【maven】阿里云和apache仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

校园跑腿系统小程序开发需求分析

校园跑腿系统小程序的开发需求分析是一个综合性的过程&#xff0c;旨在确保系统能够满足校园内用户的实际需求&#xff0c;并具备良好的用户体验。以下是对校园跑腿系统小程序开发需求分析的详细阐述&#xff1a; 一、功能需求分析 注册与登录&#xff1a;支持多种注册方式&am…

WebSphereMQ中间件监控指标解读

监控易是一款功能全面的IT监控系统&#xff0c;能够实时监控各种IT设施的性能和状态&#xff0c;帮助企业及时发现并解决潜在问题。在本次解读中&#xff0c;我们将聚焦于WebSphereMQ&#xff08;现更名为IBM MQ&#xff09;中间件的监控指标&#xff0c;深入剖析其含义和作用。…

[Linux] 权限

标题&#xff1a;[Linux] 权限 水墨不写bug 目录 一、Linux下对用户的分类 二、Linux的文件访问者的分类 三、修改文件的属性 1.修改文件的权限 &#xff08;只有拥有者和root可以修改某一个文件的权限&#xff09; 2.修改文件的拥有者 3.修改文件的所属组 四、文件创建…

Pytorch中不同的Norm归一化详细讲解

在做项目或者看论文时&#xff0c;总是能看到Norm这个关键的Layer&#xff0c;但是不同的Norm Layer具有不同的作用&#xff0c;准备好接招了吗&#xff1f;&#xff08;本文结论全部根据pytorch官方文档得出&#xff0c;请放心食用&#xff09; 一. LayerNorm LayerNorm的公…

统计学第5天

要观察性别和在线上买不买生鲜食品有没有关系&#xff0c;在现实生活中&#xff0c;女性通常去菜市场买菜的比较多&#xff0c;那么在线下是不是也是这样呢&#xff1f; 卡方统计量 如果研究的是两个类别变量&#xff0c;每个变量有多个类别&#xff0c;通常将两个变量多个类别…

ant design vue+vue3+ts+xlsx实现表格导出问excel文件(带自定义表头)~

1、首先默认你已安装ant design vue、xlsx 库、及file-saver。 2、导入&#xff1a; import * as XLSX from xlsx; import { saveAs } from file-saver; 注&#xff1a;这里的xlsx导入不能这么写&#xff0c;否则会报错&#xff0c;原因是版本不一致&#xff0c;语法向上兼容…

【多线程】线程间通信 之虚假唤醒和中断

两个线程&#xff0c;可以操作初始值为0的一个变量&#xff0c;实现一个线程对该变量1&#xff0c;一个线程对该变量-1&#xff0c;实现交替&#xff0c;来10轮&#xff0c;变量初始值为0&#xff0c;以实现此问题作为引入&#xff0c;简化我们的理解 文章目录 一、两个线程syn…

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入&#xff0c;并且数据量较大。因为数据不规则&#xff0c;所以只能使用POI进行自定义读取&#xff0c;但是发现数据量大之后&#xff0c;读取数据非常耗时。后面换成EasyExcel&#xff0c;性能起飞。 1. Excel样板 如上图&#xff0c;需要…