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

springboot+Loki+Loki4j+Grafana搭建轻量级日志系统

文章目录
  • 前言
  • 一、日志组件介绍
    • 1.1 Loki组件
    • 1.2 Loki4j组件
    • 1.3 Grafana
  • 二、组件下载安装运行
    • Loki下载安装运行
    • Grafana下载安装运行
  • 三、创建springboot项目
  • 总结

前言

日志在任何一个web应用中都是不可忽视的存在,它已经成为大部分系统的标准组成部分。搭建日志可视化的主要目的是为了更好地理解和管理应用程序产生的大量日志数据。日志数据对于了解系统的运行状态、诊断问题以及优化性能至关重要。笔者之前有一篇文章有介绍搭建ELK日志可视化系统,但是这个日志系统太重太麻烦,安装的东西很多,本文介绍一款新的轻量级日志系统,基本组成部分为这几个组件——springboot+Loki+Loki4j+Grafana,下面笔者分别介绍Loki、Loki4j、Grafana这几个组件,然后创建一个简单的springboot项目,来演示如何集成使用这几个组件搭建一个轻量级的日志系统。

本文源码仓库地址:Gitee

本文涉及到的组件资源已全部上传,请于文章顶部下载


一、日志组件介绍

1.1 Loki组件

Loki 是一个开源的日志聚合系统,由 Grafana Labs 开发和维护。Loki 的设计目标是提供一种高效、可扩展的方式来收集、索引和查询结构化日志数据。Loki 专注于日志数据,与传统的日志管理系统(如 ELK Stack)相比,它采用了不同的方法来处理日志数据。

Loki 的特点

  • 标签查询

    • Loki 使用类似于 Prometheus 的标签查询模型,允许用户通过标签来过滤和聚合日志数据。
    • 这种模型非常适合大规模的日志数据查询和分析。
  • 无索引日志存储

    • Loki 不对原始日志数据进行全文索引,而是将日志数据按流存储,并使用标签来标识每个流。
    • 这种方法降低了存储成本,并提高了查询性能。
  • 水平可扩展性

    • Loki 能够水平扩展,通过增加更多的节点来处理更多的日志数据。
    • 这使得 Loki 非常适合处理大规模的日志数据集。
  • 高可用性

    • Loki 支持高可用性部署,可以配置多个实例来确保数据的持久性和服务的连续性。
  • 多租户支持

    • Loki 支持多租户部署,不同的组织或团队可以在同一套基础设施上独立管理自己的日志数据。
  • 与 Grafana 集成

    • Loki 与 Grafana 紧密集成,可以直接在 Grafana 中查询和可视化 Loki 中的日志数据。
    • 这使得 Loki 成为了 Grafana 生态系统的一个重要组成部分。
  1. 低资源消耗
    • 相比于 ELK Stack,Loki 对资源的需求较低,更适合中小规模的团队使用。

Loki 的架构

Loki 的架构主要包括以下几个组件:

  1. Loki Server

    • 主服务器,负责接收日志数据、存储数据和处理查询。
  2. Promtail

    • 一个轻量级的日志代理,用于收集日志文件并将日志数据发送给 Loki。
  3. Grafana

    • 用于查询和显示 Loki 中的日志数据的界面。
  4. Storage

    • Loki 使用对象存储(如 S3 或 GCS)来持久化日志数据,以降低存储成本。

使用场景

Loki 特别适用于以下场景:

  • 大规模日志收集:适用于需要处理大量日志数据的环境。
  • 实时日志查询:需要快速查询和分析日志数据的场景。
  • 低成本日志存储:希望降低日志存储成本的项目。

总之,Loki 是一个现代的日志管理系统,它简化了日志数据的收集、存储和查询过程,特别适合那些需要高性能、可扩展性和成本效益的日志管理解决方案。

1.2 Loki4j组件

Loki4j 是一个基于 Java 的日志框架,它提供了一种简单的方式来将日志数据发送到 Loki。Loki4j 旨在与 Loki 日志聚合系统无缝集成,使得 Java 应用程序能够轻松地将日志数据发送到 Loki 以进行集中管理和分析。

Loki4j 的特点

  1. 易于集成

    • Loki4j 提供了一个简单的 API,可以很容易地与现有的 Java 应用程序集成。
    • 支持 SLF4J 和 Logback 等流行的 Java 日志框架。
  2. 标签支持

    • Loki4j 支持 Loki 的标签查询模型,允许用户在日志消息中添加标签,以便更好地组织和查询日志数据。
  3. 异步日志记录

    • Loki4j 支持异步日志记录,可以提高应用程序的性能,因为它不会阻塞应用程序线程。
  4. 配置灵活

    • Loki4j 提供了灵活的配置选项,可以根据需要定制日志级别、日志格式等。
  5. 错误处理

    • Loki4j 包含了错误处理机制,可以处理网络问题或其他异常情况,确保日志数据能够可靠地发送到 Loki。

1.3 Grafana

Grafana 是一款开源的数据可视化和分析平台,主要用于可视化时间和序列数据,如监控指标、日志文件、应用程序跟踪等。它支持多种数据源,包括Prometheus、InfluxDB、MySQL、PostgreSQL、Elasticsearch、CloudWatch、Graphite等,以及自定义数据源。Grafana被广泛应用于IT基础架构监控、应用性能监控(APM)、物联网(IoT)数据分析、业务指标监控等多个领域。

主要特点

  1. 直观的界面:Grafana提供了一个用户友好的界面,用于创建和编辑仪表盘,使得数据可视化变得非常简单,无需编程知识。

  2. 丰富的图表类型:支持多种图表类型,如折线图、柱状图、饼图、热力图、仪表盘、表格等,适合不同类型的视觉展示需求。

  3. 动态和交互式面板:面板可以配置为具有时间选择器、下拉菜单、查询编辑器等交互元素,使用户能更灵活地探索数据。

  4. 报警功能:Grafana支持基于规则的报警系统,当数据达到预设的阈值时,可以通过电子邮件、Slack、PagerDuty等多种方式发送通知。
    注释和事件:用户可以在图表上添加注释,记录特定时间点发生的重要事件,有助于理解数据波动的原因。

  5. 模板变量:通过使用模板变量,可以创建动态仪表盘,允许用户在不修改仪表盘的情况下,快速切换查看不同数据源或视角。

  6. 插件生态:Grafana拥有强大的社区支持,提供了大量的数据源插件、面板插件和应用插件,大大扩展了其功能和适用场景。

  7. API和脚本支持:Grafana提供了完善的API接口,允许用户通过脚本和外部应用自动化创建和管理仪表盘、数据源和用户权限。

  8. 团队协作和权限管理:支持多用户访问,可以为不同用户或团队分配不同的权限,促进团队间的协作。

应用场景

  • IT运维监控:实时监控服务器性能、网络流量、应用程序健康状况等。

  • 业务分析:展现用户行为、销售数据、营销活动效果等业务指标。

  • 物联网数据可视化:分析设备传感器数据,监控物联网系统运行状态。

  • 日志分析:结合Loki等日志管理系统,进行日志数据的实时查询和可视化展示。

Grafana凭借其灵活性和易用性,成为了数据分析和监控领域的首选工具之一,帮助企业更好地理解数据、发现问题和制定决策。

二、组件下载安装运行

笔者是在windows系统下演示,所用的组件都是windows系统下的,linux系统中安装配置自行网上搜索教程即可。

Loki下载安装运行

下载地址:Loki下载地址

在这里插入图片描述

把下载的loki-windows-amd64.exe.zip压缩包解压,得到loki-windows-amd64.exe文件,进入这个文件中可以看到有一个可执行的程序(不用去点,点了也会闪退),创建一个config文件夹

在这里插入图片描述
再进入config文件夹中,创建loki-config.yaml配置文件,文件内容如下:

server:# Loki 服务监听的 HTTP 端口号http_listen_port: 3100schema_config:configs:- from: 2024-07-01# 使用 BoltDB 作为索引存储store: boltdb# 使用文件系统作为对象存储object_store: filesystem# 使用 v11 版本的 schemaschema: v11index:# 索引前缀prefix: index_# 索引周期为 24 小时period: 24hingester:lifecycler:# 设置本地 IP 地址address: 127.0.0.1ring:kvstore:# 使用内存作为 kvstorestore: inmemory# 复制因子设置为 1replication_factor: 1# 生命周期结束后的休眠时间final_sleep: 0s# chunk 的空闲期为 5 分钟chunk_idle_period: 5m# chunk 的保留期为 30 秒chunk_retain_period: 30sstorage_config:boltdb:# BoltDB 的存储路径directory: D:softwareloki-windows-amd64.exeBoltDBfilesystem:# 文件系统的存储路径directory: D:softwareloki-windows-amd64.exeileStorelimits_config:# 不强制执行指标名称enforce_metric_name: false# 拒绝旧样本reject_old_samples: true# 最大拒绝旧样本的年龄为 168 小时reject_old_samples_max_age: 168h# 每个用户每秒的采样率限制为 32 MBingestion_rate_mb: 32# 每个用户允许的采样突发大小为 64 MBingestion_burst_size_mb: 64chunk_store_config:# 最大可查询历史日期为 28 天(672 小时),这个时间必须是 schema_config 中 period 的倍数,否则会报错max_look_back_period: 672htable_manager:# 启用表的保留期删除功能retention_deletes_enabled: true# 表的保留期为 28 天(672 小时)retention_period: 672h

注意yaml文件中的 BoltDB 的存储路径和 文件系统的存储路径,这个自行替换为自己的路径

yaml文件内容保存好后,使用cmd进入 loki-windows-amd64.exe可执行程序所在目录下,执行下面的启动命令(这个启动命令是以后启动Loki组件的专用命令,指定了配置文件

loki-windows-amd64.exe --config.file=config/loki-config.yaml

执行结果如下
在这里插入图片描述

下面的这几个文件夹都是根据配置自动生成的

在这里插入图片描述

注意:yaml配置文件配置的Loki监听端口号如下,这个记好,后面集成时需要使用

 # Loki 服务监听的 HTTP 端口号http_listen_port: 3100

Grafana下载安装运行

下载地址:Grafana下载

在这里插入图片描述

把下载后的压缩文件夹grafana-enterprise-11.1.0.windows-amd64.zip解压得到grafana-v11.1.0文件,进入bin目录找到grafana-server.exe程序双击运行

在这里插入图片描述
会自动弹出一个cmd窗口,打印出花花绿绿的日志信息,很好看

在这里插入图片描述
程序运行成功后访问:http://localhost:3000,初始账户: admin/admin 登录后需重置密码,笔者没有改变密码,还是使用原来的,下面是登录进去后的操作

添加Loki数据源

在这里插入图片描述
选择添加数据源后,出现了很多数据源,找到Loki点击即可

设置名称和监听的数据源地址

之前安装Loki配置文件里设置的:http://localhost:3100

在这里插入图片描述

设置Header和Value

Header:X-Scope-OrgID
Value:user1

在这里插入图片描述

save & test

在这里插入图片描述

注意:如果save&test报错可能是Loki服务初始化还未完成,验证Loki初始化是否完成访问:http://localhost:3100/ready,如果显示ready即初始化完成

在这里插入图片描述


三、创建springboot项目

在这里插入图片描述
添加pom依赖

 <!--Loki 日志收集--><dependency><groupId>com.github.loki4j</groupId><artifactId>loki-logback-appender</artifactId><version>1.5.1</version></dependency><!--Loki 日志发送http请求和响应工具--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>

在Resources文件夹下创建**logback-spring.xml**文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 彩色控制台控制 --><substitutionProperty name="log.pattern" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) ${PID:-} %clr(---){faint} %clr(%-80.80logger{79}){cyan} %clr(:){faint} %m%n%wEx"/><substitutionProperty name="log.pattern.no" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) ${PID:-} %clr(---){faint} %clr(%-80.80logger{79}){cyan} %clr(:){faint} %m%n%wEx"/><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><springProperty scope="context" name="LOG_FILE_DIR" source="logback.log-file-dir" defaultValue="log"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern}</pattern></encoder></appender><springProperty scope="context" name="url" source="loki.url" defaultValue="http://localhost:3100/loki/api/v1/push"/><springProperty scope="context" name="env" source="loki.label.env" defaultValue="dev"/><springProperty scope="context" name="jobName" source="loki.label.job-name" defaultValue="my-app"/><springProperty scope="context" name="hostIp" source="loki.label.host-ip" defaultValue="localhost"/><springProperty scope="context" name="orgId" source="loki.org-id" defaultValue="default-org"/><appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender"><http class="com.github.loki4j.logback.ApacheHttpSender"><url>${url}</url><tenantId>${orgId}</tenantId></http><format><label><pattern>application=${jobName},env=${env},host=${hostIp},level=%level</pattern></label><message><pattern>{"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}", "level": "%level", "logger": "%logger{36}", "thread": "%thread", "message": "%msg%n"}</pattern></message><sortByTime>true</sortByTime></format></appender><!-- 使用异步方式将日志推送至Loki --><appender name="ASYNC_LOKI" class="ch.qos.logback.classic.AsyncAppender"><!-- 队列大小设置,根据实际需要调整 --><queueSize>512</queueSize><!-- 丢弃策略,当队列满时采取的操作 --><discardingThreshold>0</discardingThreshold><neverBlock>true</neverBlock><!-- 实际的Loki Appender --><appender-ref ref="LOKI" /></appender><appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern.no}</pattern></encoder><!--滚动策略--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--路径--><fileNamePattern>${LOG_FILE_DIR}/info.%d.log</fileNamePattern><!--保留30天日志--><maxHistory>30</maxHistory></rollingPolicy></appender><appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern.no}</pattern></encoder><!--滚动策略--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--路径--><fileNamePattern>${LOG_FILE_DIR}/error.%d.log</fileNamePattern><!--保留30天日志--><maxHistory>30</maxHistory></rollingPolicy></appender><root level="info"><appender-ref ref="STDOUT" /><appender-ref ref="fileInfoLog" /><appender-ref ref="fileErrorLog" /><appender-ref ref="ASYNC_LOKI" /></root></configuration>

application.yml配置文件内容如下:

spring:application:name: Grafana-Project# Loki 日志配置
loki:# Loki 服务的 URL,用于推送日志数据url: http://localhost:3100/loki/api/v1/push# 标签配置,用于标识日志来源的额外信息label:# 环境标签,标识当前运行的环境,例如开发环境env: dev# 服务名称标签,标识日志来源的服务名称job-name: my-service# 主机 IP 标签,标识日志来源的主机 IP 地址host-ip: localhost# 组织 ID,用于多租户环境中标识日志所属的组织org-id: user1

启动类加上如下日志
在这里插入图片描述
启动后去Grafana查询日志信息

在这里插入图片描述

由上图可以看到日志已经发送到Grafana了,但是只有log方式记录的才会,控制台输出的不会记录

注意:刚启动组件时,后台需要一定时间加载,这时候是无法记录日志的。

总结

本篇文章详细介绍了使用springboot+Loki+Loki4j+Grafana搭建轻量级日志系统的步骤,整体环境为windows环境,Linux环境下的组件安装配置也类似。

相关文章:

springboot+Loki+Loki4j+Grafana搭建轻量级日志系统

文章目录 前言一、日志组件介绍 1.1 Loki组件1.2 Loki4j组件1.3 Grafana 二、组件下载安装运行 Loki下载安装运行Grafana下载安装运行 三、创建springboot项目总结 前言 日志在任何一个web应用中都是不可忽视的存在&#xff0c;它已经成为大部分系统的标准组成部分。搭建日志…...

服务器守护进程化

目录 一、守护进程的定义与特点 1、定义 2、特点 二、守护进程的原理 三、守护进程与会话&#xff08;Session&#xff09;的关系 四、C实现守护进程 守护进程&#xff08;Daemon Process&#xff09;是一个在后台运行、通常不与用户直接交互的进程。守护进程是操作系统中…...

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破

12月1日至2日&#xff0c;2024世界传感器大会&#xff08;WSS&#xff09;在郑州国际会展中心隆重举办&#xff0c;泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛&#xff0c;并在大会上带来《激光雷达用一体化光纤光源》专题演讲&#xff0c;同与…...

day35—蓝桥杯2024年第16届校赛模拟第二期-T4(最小花费)

【问题描述】 小蓝有一个整数&#xff0c;初始值为 1 &#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花费 1 的代价将整数增加 1 。 小蓝可以花费 3 的代价将整数增加一个值&#xff0c;这个值是整数的数位中最大的那个&#xff08;1 到 9&#xff09;。 小蓝可…...

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…...

游戏引擎学习第38天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上&#xff0c;但颜色错误的问题。问题最终查明是因为使用了一个调整工具&#xff0c;导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…...

P1223 排队接水(贪心)

题目描述 有 &#x1d45b;个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 &#x1d447;&#x1d456;&#xff0c;请编程找出这 &#x1d45b; 个人排队的一种顺序&#xff0c;使得 &#x1d45b;个人的平均等待时间最小。 输入格式 第一行为一个整数 &am…...

关于springBoot+vue项目中配置SSL证书问题

前端可以通过https进行访问 1.前端在访问后端接口时&#xff0c;使用https进行访问&#xff0c;在request.js配置文件中&#xff0c;这个文件是配置axios的基本请求的&#xff0c;在基础请求地址中改为https方式 2.需要在Linux中的nginx中配置ssl证书&#xff0c;具体请参考&…...

GUI的最终选择:Tkinter

Tkinter是Python默认的GUI库&#xff0c;因此使用时直接导入即可&#xff1a;import tkinter 17.1 Tkinter之初体验 代码分析&#xff1a; tkinter.mainloop()通常是程序的最后一行代码&#xff0c;执行后程序进入主事件循环。 17.2 进阶版本 将代码封装成类&#xff1a; 运…...

Photohop关于数位板没有压力感,PS画笔的钢笔压力总是显示感叹号的问题解放方法

&#xff08;实际我只用到红色字2步解决了问题&#xff0c;但为了兼顾更多朋友&#xff0c;还是把其他步骤详细完善&#xff09; 一&#xff0c;先确定数位板正常链接电脑&#xff0c;并安装好驱动&#xff0c;并在驱动测试到压力 二&#xff0c;解决PS前感叹号问题 &#xf…...

rust websocket Echo server高性能服务器开发

最近在学习websocket时,一直没有发现好的websocket server工具来调试,于是就自己做了一个websocket server用来学习和调试。因为rust性能遥遥领先,所以就采用了rust来搭建服务器。废话不多说直接上代码main.rs: use tokio::net::TcpListener; use tokio_tungstenite::tung…...

19、网络编程:

19、网络编程&#xff1a; 网络的相关概念&#xff1a; 网络通讯&#xff1a; 概念&#xff1a;两台设备之间通过网络实现数据传输&#xff1b;网络通讯&#xff1a;将数据通过网络从一台设备传输到另一台设备&#xff1b;java.net包下提供了一系列的类或接口&#xff0c;供…...

[代码随想录11]栈和队列的应用,逆波兰表达式求值 、滑动窗口最大值、前 K 个高频元素

前言 这几个题目都是栈和队列的高频面试题目&#xff0c;主要是考察思路和coding能力&#xff0c;在前面几道题目的基础上进行延伸的。同时还有优先级队列和双端队列的用法 题目链接 150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 239. 滑动窗口最大值 - 力…...

认证插件介绍

本文档是针对 UOS 登录器插件给出开发指南&#xff0c;目的是为了让开发人员了解如何在 UOS 登录器上增加一种自定义认证方式&#xff0c;对插件接口做了详细说明以及实战练习。 文章目录 一、认证插件可以做什么&#xff1f;二、认证流程三、术语说明四、安全性五、可靠性六、…...

ASP.NET Core8.0学习笔记(二十四)——EF Core级联插入与删除

一、EF Core导航关系操作——级联插入 1.级联插入&#xff1a;在含有导航属性的实体&#xff08;主体实体&#xff09;中可以对实体进行级联插入。即在创建主体实体时直接把依赖实体进行赋值&#xff0c;此时只需要执行一次插入操作即可将主体实体与依赖实体同时入库。同时&am…...

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…...

【Linux】WSL:Win运行Linux

WSL2&#xff08;Windows Subsystem for Linux 2&#xff09; 是 Microsoft 开发的技术&#xff0c;可在 Windows 系统上运行完整的 Linux 发行版环境。以下是详细的配置教程。 安装与配置 启用 WSL 功能 打开“开始”菜单&#xff0c;搜索 PowerShell&#xff0c;以 管理员身…...

js循环导出多个word表格文档

文章目录 js循环导出多个word表格文档一、文档模板编辑二、安装依赖三、创建导出工具类exportWord.js四、调用五、效果图js循环导出多个word表格文档 结果案例: 一、文档模板编辑 二、安装依赖 // 实现word下载的主要依赖 npm install docxtemplater pizzip --save// 文件操…...

Spring Boot 日志 配置 SLF4J 和 Logback

前言 在开发 Java 应用时&#xff0c;日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息&#xff0c;帮助开发者快速定位和解决问题。Spring Boot 项目默认集成了 SLF4J 和 Logback&#xff0c;使得日志配置变得简单而灵活。本文将详细介绍如何在 …...

企业级包管理器:专栏概述 (1)

在当今的前端开发领域&#xff0c;包管理器已经成为了每一位开发者不可或缺的工具。它们就像一个个神奇的工具箱&#xff0c;里面装满了各种各样的工具&#xff08;即软件包&#xff09;&#xff0c;帮助我们快速搭建项目、实现功能&#xff0c;极大地提高了开发效率。接下来&a…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

【向量库】Weaviate 搜索与索引技术:从基础概念到性能优化

文章目录 零、概述一、搜索技术分类1. 向量搜索&#xff1a;捕捉语义的智能检索2. 关键字搜索&#xff1a;精确匹配的传统方案3. 混合搜索&#xff1a;语义与精确的双重保障 二、向量检索技术分类1. HNSW索引&#xff1a;大规模数据的高效引擎2. Flat索引&#xff1a;小规模数据…...