分布式系统的日志监控
服务端日志你有多重视我们没有日志有日志但基本不去控制需要输出的内容经常微调日志只输出我们想看和有用的经常监控日志一方面帮助日志微调一方面及早发现程序的问题只做到第1点的你可以洗洗去睡了。很多公司都有做到第2点和第3点这些公司的服务端程序基本已经跑了很长时间了已比较稳定确实无需花太多时间去关注。如果一个新产品在上线初期我觉得就有必要做到第4点。日志怎么看都说了我们没有日志线上日志逐个tailgrep编写脚本下载某个时间范围内的全部日志到本地再搜索tailgrep或者把日志下载下来再搜索可以应付不多的主机和应用不多的部署场景。但对于多机多应用部署就不合适了。这里的多机多应用指的是同一种应用被部署到几台服务器上每台服务器上又部署着不同的多个应用。可以想象这种场景下为了监控或者搜索某段日志需要登陆多台服务器执行多个tail -F和grep命令。一方面这很被动。另一方面效率非常低数次操作下来程序员的心情也会变糟我还要去维护宇宙和平的好嘛。这篇文章讲的就是如何解决分布式系统的日志管理问题。先给大家看看最终的效果单个屏幕上所有服务器的日志实时滚动着显示。每条日志开头还标明日志的来源下图。实现这种效果的原理是后台跑着一个程序这个程序负责汇总所有日志到一个本地文件中。只要执行tail -f这个文件就可以做到监控日志了。因为所有日志都汇总在一个文件里了所以做日志搜索的时候只要针对这一个文件搜索就可以了。能够汇总日志文件的工具名字叫Logstash即本文的介绍重点。它使用JRuby编写开源主流免费使用简单宇宙和平使者必备单品。2. Logstash部署架构Logstash的理念很简单它只做3件事情Collect数据输入Enrich数据加工如过滤改写等Transport数据输出别看它只做3件事但通过组合输入和输出可以变幻出多种架构实现多种需求。这里只抛出用以解决日志汇总需求的部署架构图解释术语Shipper日志收集者。负责监控本地日志文件的变化及时把日志文件的最新内容收集起来输出到Redis暂存。Indexer日志存储者。负责从Redis接收日志写入到本地文件。Broker日志Hub用来连接多个Shipper和多个Indexer。无论是Shipper还是IndexerLogstash始终只做前面提到的3件事Shipper从日志文件读取最新的行文本经过处理这里我们会改写部分元数据输出到RedisIndexer从Redis读取文本经过处理这里我们会format文本输出到文件。一个Logstash进程可以有多个输入源所以一个Logstash进程可以同时读取一台服务器上的多个日志文件。Redis是Logstash官方推荐的Broker角色“人选”支持订阅发布和队列两种数据传输模式推荐使用。输入输出支持过滤改写。Logstash支持多种输出源可以配置多个输出实现数据的多份复制也可以输出到EmailFileTcp或者作为其它程序的输入又或者安装插件实现和其他系统的对接比如搜索引擎Elasticsearch。总结Logstash概念简单通过组合可以满足多种需求。3. Logstash的安装搭建和配置3.1. 安装Java下载JDK压缩包。一般解压到/user/local/下形成/usr/local/jdk1.7.0_79/bin这种目录结构。配置JAVA_HOME环境变量echo export JAVA_HOME/usr/local/jdk1.7.0_79 ~/.bashrc。3.2 安装Logstash去官网下载Logstash的压缩包。一般也解压到/usr/local/下形成/usr/local/logstash-1.4.3/bin这种目录结构。Logstash的运行方式为主程序配置文件。CollectEnrich和Transport的行为在配置文件中定义。配置文件的格式有点像json又有点像php。3.3. 编写Shipper角色的配置文件shipper.confinput { file { path [ # 这里填写需要监控的文件 /data/log/php/php_fetal.log, /data/log/service1/access.log ] } }如上input描述的就是数据如何输入。这里填写你需要收集的本机日志文件路径。output { # 输出到控制台 # stdout { } # 输出到redis redis { host 10.140.45.190 # redis主机地址 port 6379 # redis端口号 db 8 # redis数据库编号 data_type channel # 使用发布/订阅模式 key logstash_list_0 # 发布通道名称 } }如上output描述的就是数据如何输出。这里描述的是输出到Redis。data_type的可选值有channel和list两种。用过Redis的人知道channel是Redis的发布/订阅通信模式而list是Redis的队列数据结构。两者都可以用来实现系统间有序的消息异步通信。channel相比list的好处是解除了发布者和订阅者之间的耦合。举个例子一个Indexer在持续读取Redis中的记录现在想加入第二个Indexer如果使用list就会出现上一条记录被第一个Indexer取走而下一条记录被第二个Indexer取走的情况两个Indexer之间产生了竞争导致任何一方都没有读到完整的日志。channel就可以避免这种情况。这里Shipper角色的配置文件和下面将要提到的Indexer角色的配置文件中都使用了channel。filter { mutate { # 替换元数据host的值 replace [host, 10.140.46.134 B[1]] } }如上filter描述的是如何过滤数据。mutate是一个自带的过滤插件它支持replace操作可以改写数据。这里改写了元数据中的host字段替换成了我们自己定义的文本。Logstash传递的每条数据都带有元数据如versiontimestamphost等等。有些可以修改有些不允许修改。host记录的是当前主机的信息。Logstash可能不会去获取主机的信息或者获取的不准确这里建议替换成自己定义的主机标示以保证最终的日志输出可以有完美的格式和良好的可读性。3.4 编写Indexer角色的配置文件indexer.confinput { redis { host 10.140.45.190 # redis主机地址 port 6379 # redis端口号 db 8 # redis数据库编号 data_type channel # 使用发布/订阅模式 key logstash_list_0 # 发布通道名称 } }如上input部分设置为从redis接收数据。output { file { path /data/log/logstash/all.log # 指定写入文件路径 message_format %{host} %{message} # 指定写入格式 flush_interval 0 # 指定刷新间隔0代表实时写入 } }如上output部分设置为写入本地文件。官方文档里flush_interval为缓冲时间单位秒。我实践下来不是秒而是数量Logstash会等待缓冲区写满一定数量后才输出。这对线上调试是不能接受的建议上线初期设为0。程序稳定后随着日志量的增大可以增大flush_interval的值以提高文件写入性能。Indexer的配置文件中我明确指定了message_format的格式其中%{host}对应的就是之前手动设置的host元数据。3.5. 启动Logstash# 先在Indexer主机上启动 nohup /usr/local/logstash-1.4.3/bin/logstash agent -f indexer.conf /dev/null # 然后在Shipper主机上启动 nohup /usr/local/logstash-1.4.3/bin/logstash agent -f shipper.conf /dev/null # 最后在Indexer上观察日志 tail -f /data/log/logstash/all.log我们来测试一下切到Shipper主机上模拟日志产生echo Hello World /data/log/php/php_fetal.log再切换到Indexer主机上如果出现10.140.46.134 B[1] Hello World说明Logstash部署成功。3.6. 日志着色脚本在tail -f的时候如果使用awk配合echo可以匹配你想要高亮的文本改变他们的前景色和背景色。就像效果图里的那样这是宇宙和平使者必备单品的重要属性好嘛。这里附上我写的脚本把脚本中的关键信息替换成你想要匹配的文本即可tail -f /data/log/logstash/all.log | awk { if (match($0, /.*(PHP Deprecated|PHP Notice|PHP Fatal error|PHP Warning|ERROR|WARN).*/)) { print \033[41;37;1m$0\033[0m } else if (match($0, /.*关键信息1.*/)) { print \033[32;1m$0\033[0m } else if (match($0, /.*关键信息2.*/)) { print \033[36;1m$0\033[0m } else { print $0 } }

相关新闻

PVsyst 8.1.4-光伏系统设计和仿真软件

PVsyst 8.1.4-光伏系统设计和仿真软件

PVsyst 版本 8 对我们的软件功能进行了重大改进,这体现了PVsyst 对光伏项目开发和模拟的持续承诺。定义您的项目 系统设计:快速设计并网、独立或抽水式光伏系统。该程序会指导您选择合适的组件,以确定项目规模。 系统容量规划:可视…

2026/7/3 1:18:46阅读更多 →
Codex++ 接入 DeepSeek API 完全指南:从安装到实战

Codex++ 接入 DeepSeek API 完全指南:从安装到实战

内容摘要:大家好,我是码农刚子。本文介绍通过 Codex 将 DeepSeek API 接入 Codex 桌面端 AI 编程助手。Codex 为开源增强启动器,不修改原文件,支持第三方模型。内容涵盖环境要求、安装配置、申请 API Key 及启动验证,可…

2026/7/3 1:18:46阅读更多 →
JMeter跨界UI自动化:统一测试工具链的实战方案

JMeter跨界UI自动化:统一测试工具链的实战方案

1. 项目概述:当性能测试工具跨界UI自动化提到JMeter,绝大多数测试工程师的第一反应就是“性能测试工具”。确实,作为Apache旗下的开源项目,JMeter凭借其强大的并发模拟、灵活的协议支持和丰富的报告功能,在接口压测、负…

2026/7/3 1:18:46阅读更多 →
基于STM32单片机WIFI云平台物联网 水质检测 PH酸碱度 浑浊度成品1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机WIFI云平台物联网 水质检测 PH酸碱度 浑浊度成品1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机WIFI云平台物联网 水质检测 PH酸碱度 浑浊度成品1(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_STM32F103C8T6单片机进行数据处理OLED液晶显示当前参数PH模块采集当前水质PH酸碱度DS18B20温度传感器采集当前水体温度浊度&…

2026/7/3 2:38:51阅读更多 →
聊一聊数据库中的锁

聊一聊数据库中的锁

是我在数据库中添加了一个定时执行的小程序,每到周日,就自动运行如下的脚本 Copy delete from 后宫佳丽 where age>18 一开始还自我感觉良好,后面我就发现不对了,每到周日,这个脚本一执行就是一整天,运行的时间有点长是小事,重点是这大好周日,我再想读这张表的数据,怎么也…

2026/7/3 2:38:51阅读更多 →
终极RSA攻击工具RsaCtfTool:从零开始掌握密码学实战

终极RSA攻击工具RsaCtfTool:从零开始掌握密码学实战

终极RSA攻击工具RsaCtfTool:从零开始掌握密码学实战 【免费下载链接】RsaCtfTool RSA attack tool (mainly for ctf) - retrieve private key from weak public key and/or uncipher data 项目地址: https://gitcode.com/gh_mirrors/rs/RsaCtfTool RSA攻击工…

2026/7/3 2:38:51阅读更多 →
智谱数开一面:GraphRAG用过吗?和RAG到底有什么区别?

智谱数开一面:GraphRAG用过吗?和RAG到底有什么区别?

前言 最近在准备跳槽,面了几家 AI 数据开发相关岗位,其中智谱一面遇到了一道让我印象很深的问题: GraphRAG 用过吗?和传统 RAG 有什么区别? 这似乎是一道很基础的概念题,但真正回答起来才发现,…

2026/7/3 2:38:51阅读更多 →
Django连接MySQL配置与性能优化实战

Django连接MySQL配置与性能优化实战

1. Django与MySQL连接基础解析 作为Python生态中最流行的Web框架,Django默认使用SQLite作为开发数据库,但在生产环境中MySQL才是更常见的选择。最近在重构一个电商项目时,我再次经历了完整的Django-MySQL配置流程,发现很多新手容易…

2026/7/3 2:38:51阅读更多 →
使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法

使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法

。下面是我们本次的工程目录。MyPkg├── Application│ └── GopDrawApp│ ├── GopDrawApp.c│ └── GopDrawApp.inf├── MyPkg.dec└── MyPkg.dsc什么是图形输出协议(GOP)GOP(Graphics Output Protocol,图形输…

2026/7/3 2:33:50阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →