Linux下日志方案对比
一、使用printf函数这是最基础的日志输出方式使用printf、cout、cerr等函数无需额外安装适用于嵌入式裸机或快速调试场景。假设我们的程序叫server要生成日志文件XXX.log则可以执行./server XXX.log 21 然后通过命令​tail -f XXX.log或tail -f XXX.log -n 200可以实时查看日志文件内容。缺点‌1.类型不安全‌格式符如 %d、%s与参数类型需手动匹配错误可能导致崩溃或乱码。‌2.无日志级别‌无法区分 INFO/WARN/ERROR需通过宏或条件编译手动控制。‌3.线程不安全‌多线程并发调用时输出会交错需自行加锁。‌4.功能单一‌仅支持格式化输出缺乏时间戳、文件名、滚动文件等生产需求。二、使用systemctlsystemctl 是 Linux 系统管理服务的核心命令‌用来启动、停止、重启服务以及设置开机自启是 systemd 系统的主要管理工具。可以通过journalctl 工具来查看systemd服务的日志具体可以参考《Linux下使用systemctl启动服务失败》三、使用日志库比如使用spdlog库。相比 printfspdlog 的优势主要不是“能打印文字”而是提供完整的日志体系。能力printfspdlog日志级别需要自行实现trace/debug/info/warn/error/critical运行时过滤不支持可动态调整级别多线程多次打印可能交错多线程 logger 保证单条日志完整时间、线程信息手动拼接自动格式化文件和控制台手动处理支持多个 sink日志轮转需要 logrotate或自研支持按大小、日期轮转异步写入需要自研队列内置异步模式格式安全%d/%s 写错可能出问题基于 fmt 的类型安全格式化flush 策略手动 fflush可按级别或周期 flush模块管理需要自行约定可为 Routing、Conmon 等创建独立 logger例如printf(device%s error%d\n, name.c_str(), errorCode);可以改为spdlog::error(device{} error{}, name, errorCode);spdlog库的主要优势包括1.控制日志量生产环境使用INFO排查关键问题时临时开启DEBUG无需删除或注释大量打印代码。2.多线程日志更清楚多个 printf 可能互相穿插spdlog 可以把一条日志完整输出。3.统一格式比如2026-08-04 10:15:32.123 ERROR [routing] [thread 1832] devicespeaker1 code-805时间、级别、模块和线程 ID 不再由每个函数自行拼接。4.减少业务线程阻塞高频日志可以使用异步 logger让后台线程负责输出。不过错误和崩溃前日志需要合理设置 flush 和队列溢出策略。更容易管理敏感信息。四、日志使用技巧1.日志可以设置为按200MB、14个历史文件轮转压缩仅root可读防止日志无限增长占满磁盘。每个日志文件每天检查一次日志达到约200MB时进行轮转当前日志改名保存并创建新的日志文件继续记录最多保留14份历史日志。较旧的历史日志压缩为.gz文件。超过14份后最旧的一份会被自动删除。2.一个服务器可以同时生成多份日志。比如假设业务服务器名称为localserver负责和流媒体服务器ZLMediaKit通讯以及接收java端的控制指令启动推流控制设备等。则localserver可以同时生成三份日志/var/log/localserver/longrun-debug.log/var/log/localserver/zlmediakit-longrun.log/var/log/localserver/health.log三份日志分别对应不同层次。其中/var/log/localserver/longrun-debug.log为localserver的应用日志记录指令收发和publish/FFmpeg推流过程。/var/log/localserver/zlmediakit-longrun.log为ZLMediaKit媒体服务日志记录流注册/注销、RTSP 推流、WebRTC/HLS 播放、播放器连接、DTLS 握手和媒体会话断开等用于判断“流已经推送成功但网页播放失败”的媒体服务或播放端问题。/var/log/localserver/health.log为每分钟一次的系统健康快照记录localserver和ZLMediaKit的进程状态、CPU、内存、线程数、文件描述符、连接数及重启次数。用于判断长时间运行后是否出现资源泄漏、连接堆积或进程重启。这样当发生推流失败等问题时我们可以按照顺序进行排查在longrun-debug.log确认localserver是否成功建立并持续推流在zlmediakit-longrun.log确认流是否注册以及网页播放器是否成功连接在health.log检查故障发生前后是否存在资源异常或服务重启。3.如果是为了排查长时间运行崩溃的问题则可以加入core dump、退出码记录和自动拉起脚本再重启复现以获取准确崩溃栈后修复。此时推荐使用追加方式写日志... /root/Test/gst-test/player.log 21这样做的优点是不会清空旧日志。可以保留之前崩溃前后的现场。

相关新闻

动态规划进阶:方格取数问题中按列DP与两次扫描的解法详解

动态规划进阶:方格取数问题中按列DP与两次扫描的解法详解

1. 项目概述与问题拆解 今天我们来啃一块信奥(信息学奥林匹克)动态规划里的硬骨头——方格取数问题。具体来说,是题目 B4140 [信息与未来 2016] 方格取数。很多刚接触动态规划的同学,一看到“方格”、“路径”、“最大值”这些词&…

2026/11/1 23:08:02 阅读更多 →
大模型微调避坑指南:LoRA实战中的四大工程陷阱与解决方案

大模型微调避坑指南:LoRA实战中的四大工程陷阱与解决方案

1. 项目概述:当微调成为“负优化”的起点最近在社区里,看到不少朋友在尝试微调自己的大语言模型(LLM)或扩散模型时,都遇到了一个令人沮丧的“怪圈”:模型在微调前还能正常对话、生成,经过一番精…

2026/10/25 19:05:46 阅读更多 →
MySQL int(11)与Java数据类型:存储原理、映射实践与性能优化

MySQL int(11)与Java数据类型:存储原理、映射实践与性能优化

1. 项目概述:从“11”引发的类型思考 最近在带新人,发现一个挺有意思的现象:很多刚接触数据库和编程的朋友,对 int(11) 里的这个“11”到底代表什么,以及为什么Java里一个 int 占4个字节而一个 long 占8个字节&a…

2026/10/29 14:55:55 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻