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

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录

1、EFK简介

2、EFK框架

2.1、Fluentd系统架构

2.2、Elasticsearch系统架构

2.3、Kibana系统架构

3、Elasticsearch接口

4、EFK在虚拟机中安装步骤

4.1、安装elasticsearch

4.2、安装kibana

4.3、安装fluentd

4.4、进入kibana创建索引

5、Fluentd配置介绍


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html       Elasticsearch,Fluentd和Kibana(EFK)可以进行收集,索引,搜索和可视化日志数据。Elasticsearch负责数据的存储和索引,Fluentd负责数据的调整、过滤、传输,Kibana负责数据的展示。今天就来详细介绍一下使用Elasticsearch,Fluentd和Kibana搭建日志管理系统的详细过程。

1、EFK简介

      Elasticsearch,Fluentd和Kibana(EFK)可以进行收集,索引,搜索和可视化日志数据。Elasticsearch负责数据的存储和索引,Fluentd负责数据的调整、过滤、传输,Kibana负责数据的展示。

       fluentd实时收集日志,把日志作为JSON stream,可以同时从多台server上收集大量日志,易于安装,有灵活的插件机制和缓冲,支持日志转发。它统一实现了每一环节的数据传输,只需要关注数据处理的逻辑,也不用学习各种API,通过配置就可以实现实时增量数据的流出和流入。

       Elasticsearch提供了一个分布式多用户能力的全文搜索引擎。基于RESTful web接口,且提供持久存储、统计等多项功能。可用于全文搜索、结构化搜索、分析以及将这三者混合使用,通过简单的配置就可以做数据复制和分片,并且,它在NRT(Near Real Time)方面做了一些优化,使得应用在实时性方面有很好的表现。

       Kibana 是一个基于浏览器页面的 ElasticSearch 前端展示工具,内置了各种查询和聚合操作,并拥有图形化展示功能。使用它对日志进行高效地搜索、可视化、分析等各种操作。可以通过各种图表进行高级数据分析及展示。

2、EFK框架

       EFK日志处理系统的流程框架如下所示:

具体的流程为:fluentd进行日志的收集,数据来源可以自己设置为容器日志或者存储在本地文件的日志文件,收集之后发送给Elasticsearch进行统一的管理、搜索等操作,最后kibana将结果展示在web界面上。

       日志的处理流程可以简化为:

当考虑健壮性时,需要复杂配置,如图:

多了一层fluentd,以及备选的点,这样日志收集的过程更加稳定以及可靠。

2.1、Fluentd系统架构

       fluentd系统如下图所示:

fluentd的数据流简单,从数据源获取,进行集中,然后发送到输出的地方,流程:输入input --> 处理filter(不是必须的) --> 输出output

input:读取日志内容。

output:输出,常见的有mongodb,elasticsearch,kafka等,只需安装相关的插件即可。

详细结构如下图所示:

2.2、Elasticsearch系统架构

         Elasticsearch作用:fluentd将过滤后的日志内容发给全文搜索服务ElasticSearch,提供检索功能。Elasticsearch 的rest请求的传递流程如下所示:

用户发起http请求,Elasticsearch 的9200端口接受请求后,传递给对应的RestAction。RestAction做的事情很简单,将rest请求转换为RPC的TransportRequest,然后调用NodeClient,相当于用客户端的方式请求RPC服务,只不过transport层会对本节点的请求特殊处理。

2.3、Kibana系统架构

        Kibana是一个强大的数据展示工具。大多数情况下,不需要开发任何代码,就可以得到一个Dashboard。使用 Kibana 来查询,浏览并且可以与存储在 Elasticsearch indices(索引)中的数据交互。需要做的是:

(1)把数据放到ES中

(2)是在Kibana页面上配置报表模版,或按照规则写一套报表模版。

kibana的工作流程如下:

3、Elasticsearch接口

        多种语言都可以使用 REST API 通过端口 9200 和 Elasticsearch 进行通信,REST请求和应答是典型的JSON(JavaScript对象 符号)格式。通常情况下,一个REST请求包含一个JSON文件,其回复也是一个JSON文件。

一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'。

其中被 < > 标记的部分分别为:

VERB:适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。

PROTOCOL:http 或者 https`(如果你在 Elasticsearch 前面有一个 `https 代理)。

HOST:Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。

PORT:运行 Elasticsearch HTTP 服务的端口号,默认是 9200。

PATH:API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm。

QUERY_STRING:任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)。

BODY:一个 JSON 格式的请求体 (如果请求需要的话)。

GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT。

       在请求的查询串参数中加上 pretty 参数,这将会调用 Elasticsearch 的 pretty-print 功能,该功能 使得 JSON 响应体更加可读。但是, _source 字段不能被格式化打印出来。相反,我们得到的 _source 字段中的 JSON 串,刚好是和我们传给它的一样。例如:

curl -XGET http://localhost:9200/website/blog/123 -d ‘{...}’

一个查询语句的典型结构:

curl -XGET http://localhost:9200/search -d ‘

{

    QUERY_NAME: {

        ARGUMENT: VALUE,

        ARGUMENT: VALUE,...

    }

} ‘

要启用表头,添加 ?v 参数即可。

       Elasticsearch集群个数:应该始终被配置为 master 候选节点的法定个数(大多数个)。法定个数就是 ( master 候选节点个数 / 2) + 1。Elasticsearch 自己会输出很多日志,都放在 ES_HOME/logs 目录下。默认的日志记录等级是 INFO。

4、EFK在虚拟机中安装步骤

4.1、安装elasticsearch

        首先,安装JDK或者openJDK(这里以openJDK为例),然后安装elasticsearch,最后启动elasticsearch:

[root@elk elk]# yum install java-1.8.0-openjdk -y[root@elk elk]# wget -c https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.3/elasticsearch-2.3.3.rpm[root@elk elk]# yum localinstall elasticsearch-2.3.3.rpm –y[root@elk elk]# systemctl daemon-reload[root@elk elk]# systemctl enable elasticsearch[root@elk elk]# systemctl start elasticsearch

修改防火墙,开放9200和9300端口:

[root@elk elk]# firewall-cmd --permanent --add-port={9200/tcp,9300/tcp}[root@elk elk]# firewall-cmd –reload

4.2、安装kibana

[root@elk elk]# wget https://download.elastic.co/kibana/kibana/kibana-4.5.1-1.x86_64.rpm[root@elk elk]# yum localinstall kibana-4.5.1-1.x86_64.rpm –y[root@elk elk]# systemctl enable kibana[root@elk elk]# systemctl start kibana

修改防火墙,对外开放tcp/5601:

[root@elk elk]# firewall-cmd --permanent --add-port=5601/tcp[root@elk elk]# firewall-cmd --reload

打开浏览器测试访问kibana的首页http://localhost:5601/

4.3、安装fluentd

        安装前查看当前最大打开文件数:

$ ulimit -n

如果查看到的是1024,那么这个数值是不足的,则需要修改配置文件提高数值

vi /etc/security/limits.conf

设置值如下:

root soft nofile 65536

root hard nofile 65536

* soft nofile 65536

* hard nofile 65536

然后重启系统。

4.3.1、安装fluentd

        执行如下命令(命令将会自动安装td-agent,td-agent即为fluentd):

$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

启动td-agent:

$ /etc/init.d/td-agent start$ /etc/init.d/td-agent status

或者

$ systemctl start td-agent$ systemctl status td-agent

        简单demo测试HTTP logs:

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

安装必要的插件:

$ /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch$ /usr/sbin/td-agent-gem install fluent-plugin-typecast$ /usr/sbin/td-agent-gem install fluent-plugin-secure-forward$ systemctl restart td-agent

如果上面直接安装不了,则要gem插件(安装rubygems)。

4.3.2、配置td-agent

        使docker生成的日志输出到elasticsearch,修改td-agent的配置

$ vi /etc/td-agent/td-agent.conf

修改内容为如下(这里没有填写端口,默认使用9200端口)

<source>

  @type forward

  port 24224

  bind 0.0.0.0

</source>

<match alpine:**>

  @type elasticsearch

  logstash_format true

  flush_interval 10s # for testing

  host 127.0.0.1

</match>

       重启td-agent:

$ systemctl restart td-agent

启动docker镜像,这里使用alpine做测试:

docker run --log-driver=fluentd --log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" alpine:3.3 echo "helloWorld"

检查fluentd是否正常转发数据,检查td-agent日志,如果最后出现如下一行,则表明正常连接elasticsearch。/var/log/td-agent/td-agent.log中最后一行如下:

2017-12-26 00:40:37 -0500 [info]: #0 Connection opened to Elasticsearch cluster => {:host=>"127.0.0.1", :port=>9200, :scheme=>"http"}

2017-12-26 01:22:42.071896593 -0500 debug.test: {"json":"message"}

4.3.3、fluentd使用

       td-agent默认将配置收集来自http的日志,并将日志转储到/var/log/td-agent/td-agent.log,如果需要配置fluent接收docker日志,则在/etc/td-agent/td-agent.conf中增加,并重启td-agent,systemctl restart td-agent

<match docker.**>

          type stdout

 </match>

配置docker使用fluent为log-driver,有两种方法,指定特定的容器或者配置docker daemon将所有容器日志均存储到fluent中。

方法1:指定容器

docker run --log-driver=fluentd --log-opt fluentd-address=myhost.local:24224

方法2: 设置全局log-driver

docker daemon --log-driver=fluentd

至此,已经成功将docker的日志交给fluent处理。

4.4、进入kibana创建索引

       访问页面:http://localhost:5601/

点击“create”,即可看到如下设置:

5、Fluentd配置介绍

       配置文件为vi /etc/td-agent/td-agent.conf,配置文件主要由以下指令组成:

1)source  决定输入源.

2)match  决定输出目的地.

3)filter  决定事件处理管道.

4)system  设置系统广泛的配置.

5)label  输出分组和筛选内部路由

6)@include  包括其他文件.

       source: 输入源包括http和forward,http将fluentd转换为http端点以接收传入的http消息,forward将fluentd转换为TCP端点,以接受TCP包。当然,它可以同时出现。每个源指令必须包含一个类型参数,类型参数指定要使用的输入插件。

       match: 告诉fluentd做什么,match指令使用匹配的标记查找事件,并处理它们。最常用的匹配指令是将事件输出到其他系统。Fluentd的标准输出插件包括文件file和转发forward。让我们将这些添加到配置文件中。每个匹配指令必须包含匹配模式和类型参数。只有带有与模式匹配的标记的事件才会被发送到输出目的地. 广泛的匹配模式应该在严格的匹配模式之后定义。

       流程就是source 收集日志,然后由串联的 filter 做流式的处理,最后交给 match 进行分发。同时还可以用 label 将任务分组,用 error 处理异常,用 system 修改运行参数。日志存储的格式,根据源不同,比如源是docker的syslog,格式就是syslog的日志形式按配置修改,主要的格式化配置都在配置文件中的 format 这段配置里,主要采用正则表达式拆分数据到自定义的以 <> 包围起来的属性中。

相关文章:

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 VC常…...

【Python小项目之Tkinter应用】解决Python的Pyinstaller将.py文件打包成.exe可执行文件后文件过大的问题

文章目录 前言1. 创建新项目![请添加图片描述](https://img-blog.csdnimg.cn/36dcadc85d864a08b93af78b9e79ff6d.jpeg)2.删除原项目中的全部文件3.将要打包的文件放入该项目目录下4.创建虚拟环境5.设置解释器为虚拟环境中的python解释器6.查看是否成功使用虚拟环境中的python解…...

Ab3d.DXEngine 6.0 Crack 2023

Ab3d.DXEngine 不是另一个游戏引擎&#xff08;如Unity&#xff09;&#xff0c;它强迫您使用其游戏编辑器、其架构&#xff0c;并且需要许多技巧和窍门才能在标准 .Net 应用程序中使用。Ab3d.DXEngine 是一个新的渲染引擎&#xff0c;它是从头开始构建的&#xff0c;旨在用于标…...

Wireshark抓包常用指令

1.常用过滤规则 指定源地址&#xff1a; ip.src 10.0.1.123ip.src 10.0.1.123 && udphttp数据链路层&#xff1a;筛选mac地址为04:f9:38:ad:13:26的数据包----eth.src 04:f9:38:ad:13:26筛选源mac地址为04:f9:38:ad:13:26的数据包----eth.src 04:f9:38:ad:13:26网…...

Docker Swarm

Docker Swarm提供 Docker 容器集群服务&#xff0c;是 Docker 官方对容器云生态进行支持的核心方案。将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Swarm mode内置 kv 存储功能&#xff0c;提供了众多的新特性&#xff0c;比如&a…...

jupyter notebook安装和删除kernel的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

中级深入--day16

爬虫(Spider)&#xff0c;反爬虫(Anti-Spider)&#xff0c;反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... Day 1 小黄想要某站上所有的电影&#xff0c;写了标准的爬虫(基于HttpClient库)&#xff0c;不断地遍历某站的电影列表页面&#xff0c;根据 Html 分析电影名字存进…...

【洛谷 P1031】[NOIP2002 提高组] 均分纸牌 题解(贪心)

[NOIP2002 提高组] 均分纸牌 题目描述 有 N N N 堆纸牌&#xff0c;编号分别为 1 , 2 , … , N 1,2,\ldots,N 1,2,…,N。每堆上有若干张&#xff0c;但纸牌总数必为 N N N 的倍数。可以在任一堆上取若干张纸牌&#xff0c;然后移动。 移牌规则为&#xff1a;在编号为 1 …...

E5071C是德科技网络分析仪

描述 E5071C网络分析仪提供同类产品中最高的RF性能和最快的速度&#xff0c;具有宽频率范围和多功能。E5071C是制造和R&D工程师评估频率范围高达20 GHz的RF元件和电路的理想解决方案。特点: 宽动态范围:测试端口的动态范围> 123 dB(典型值)快速测量速度:41毫秒全2端口…...

ViTPose+:迈向通用身体姿态估计的视觉Transformer基础模型 | 京东探索研究院

身体姿态估计旨在识别出给定图像中人或者动物实例身体的关键点&#xff0c;除了典型的身体骨骼关键点&#xff0c;还可以包括手、脚、脸部等关键点&#xff0c;是计算机视觉领域的基本任务之一。目前&#xff0c;视觉transformer已经在识别、检测、分割等多个视觉任务上展现出来…...

Android 播放mp3文件

1&#xff0c;在res/raw中加入mp3文件 2&#xff0c;实现播放类 import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; import android.util.Log;import java.util.HashMap; import java.util.Map;public class UtilSound {pu…...

在OpenStack私有云上安装配置虚拟机

文章目录 零、学习目标一、登录大数据实训云二、创建网络三、创建路由四、添加接口五、创建端口六、添加安全组规则七、创建实例&#xff08;一&#xff09;实例规划&#xff08;二&#xff09;创建实例 - ied&#xff08;三&#xff09;创建实例 - master、slave1与slave2&…...

pyCharm远程DEBUG

第一步&#xff0c;添加一个远程机器的解释器 ssh 远程机器解释器添加&#xff0c; 我本地ssh有配置目标机器。 如果没配置&#xff0c;那就选着new server configuration 新增一个。 interpreter 指定远程机器python&#xff0c; &#xff08;机器上有多个版本python里尤其要…...

微服务框架Go-kit

微服务框架Go-kit go kit简介第一个go kit应用go kit基本概念go kit Endpointsgo kit Endpoint 定义go kit Endpoint 函数签名go kit Endpoint 链式操作go kit Endpoint 请求和响应转换go kit Endpoint 中间件go kit Endpoint 错误处理go kit 传输层go kit HTTP 传输层go kit …...

《王道24数据结构》课后应用题——第三章 栈和队列

第三章 【3.1】 03、 假设以I和O分别表示入栈和出操作。栈的初态和终态均为空&#xff0c;入栈和出栈的操作序列可表示为仅由I和O组成的序列&#xff0c;可以操作的序列称为合法序列&#xff0c;否则称为非法序列。 如IOIIOIOO 和IIIOOIOO是合法的&#xff0c;而IOOIOIIO和II…...

查看linux开发板的CPU频率

1&#xff09;查看CPU可设置的频率列表 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 2&#xff09;查看CPU当前所使用的频率&#xff1a; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 3&#xff09;设置CPU频率&#xff08;最高…...

对象模型和this指针(个人学习笔记黑马学习)

1、成员变量和成员函数 #include <iostream> using namespace std; #include <string>//成员变量和成员函数分开存储class Person {int m_A;//非静态成员变量 属于类的对象上的static int m_B;//静态成员变量 不属于类的对象上void func() {} //非静态成员函数 不…...

SpringCloudAlibaba常用组件

SpringCloudAlibaba常用组件 微服务概念 1.1 单体、分布式、集群 单体 ⼀个系统业务量很⼩的时候所有的代码都放在⼀个项⽬中就好了&#xff0c;然后这个项⽬部署在⼀台服务器上就 好了。整个项⽬所有的服务都由这台服务器提供。这就是单机结构。 单体应⽤开发简单,部署测试…...

Shotcut for Mac:一款强大而易于使用的视频编辑器

随着数码相机的普及&#xff0c;视频编辑已成为我们日常生活的一部分。对于许多专业和非专业用户来说&#xff0c;找到一个易于使用且功能强大的视频编辑器是至关重要的。今天&#xff0c;我们将向您介绍Shotcut——一款专为Mac用户设计的强大视频编辑器。 什么是Shotcut&…...

【数学建模】2023数学建模国赛C题完整思路和代码解析

C题第一问代码和求解结果已完成&#xff0c;第一问数据量有点大&#xff0c;经过编程整理出来了单品销售额的汇总数据、将附件2中的单品编码替换为分类编码&#xff0c;整理出了蔬菜各品类随着时间变化的销售量&#xff0c;并做出了这些疏菜品类的皮尔森相关系数的热力图&#…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...