
🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:

文章目录
- [1 ~> 日志基础概念](#1 ~> 日志基础概念)
-
- [1.1 日志的定义](#1.1 日志的定义)
- [1.2 日志的核心价值](#1.2 日志的核心价值)
- [1.3 常见日志输出载体](#1.3 常见日志输出载体)
- [2 ~> 日志级别体系](#2 ~> 日志级别体系)
-
- [2.1 标准日志级别(优先级从低到高)](#2.1 标准日志级别(优先级从低到高))
- [2.2 日志级别控制规则](#2.2 日志级别控制规则)
- [2.3 分环境配置策略](#2.3 分环境配置策略)
- [3 ~> 日志库封装的核心价值(与 std::cout 对比)](#3 ~> 日志库封装的核心价值(与 std::cout 对比))
-
- [3.1 日志级别管理能力](#3.1 日志级别管理能力)
- [3.2 标准化日志格式化](#3.2 标准化日志格式化)
- [3.3 日志存储与生命周期管理](#3.3 日志存储与生命周期管理)
- [3.4 多线程线程安全保障](#3.4 多线程线程安全保障)
- [3.5 运行性能优化](#3.5 运行性能优化)
- [4 ~> 项目落地:spdlog 日志库封装方案](#4 ~> 项目落地:spdlog 日志库封装方案)
-
- [4.1 技术选型说明](#4.1 技术选型说明)
- [4.2 封装设计:单例模式](#4.2 封装设计:单例模式)
- [4.3 典型业务日志埋点场景](#4.3 典型业务日志埋点场景)
- 结尾

1 ~> 日志基础概念
1.1 日志的定义
日志是程序运行过程中,对关键运行信息、状态变更、异常事件的记录载体,用于辅助开发、测试、运维人员感知程序运行状态、追溯与定位故障问题。
1.2 日志的核心价值
- 正常状态埋点:记录核心流程执行结果,如配置加载、服务初始化、接口调用状态
- 异常信息留存:记录错误发生时的上下文信息,留存故障现场
- 问题排查支撑:通过日志上下文快速复现、定位线上问题,降低调试与运维成本
1.3 常见日志输出载体
- 本地控制台:开发调试阶段实时查看运行信息
- 本地文件:生产环境持久化存储,支持长期归档
- 远程日志服务 / 服务器:分布式系统下的集中采集、分析与告警
2 ~> 日志级别体系
2.1 标准日志级别(优先级从低到高)
- TRACE:最细粒度的跟踪信息,用于追踪完整程序执行流,如函数入栈 / 出栈、分支执行路径、中间变量取值
- DEBUG:调试级信息,服务于开发阶段,用于辅助理解程序运行状态,如关键节点埋点、核心变量状态输出
- INFO:常规运行信息,反映程序正常运行状态,如系统启动完成、配置文件加载成功、核心业务流程执行完成
- WARN / WARNING:警告级信息,存在潜在风险但不影响程序主流程运行,如非关键参数异常、资源使用率偏高
- ERROR:错误级信息,特定功能模块执行失败,但程序整体仍可继续运行,如文件打开失败、数据库单次连接失败
- CRITICAL / FATAL:致命错误,可能导致程序崩溃、服务完全不可用,如系统资源耗尽、核心数据损坏、主流程依赖缺失
2.2 日志级别控制规则
- 优先级规则:
TRACE < DEBUG < INFO < WARN < ERROR < CRITICAL - 过滤逻辑:设置全局日志级别后,仅优先级大于等于该级别的日志 会被输出,低于该级别的日志会被全局过滤
- 示例:设置全局级别为
INFO时,仅INFO、WARN、ERROR、CRITICAL级日志生效,TRACE与DEBUG级日志不输出
- 示例:设置全局级别为
2.3 分环境配置策略
- 开发 / 测试环境:通常设置为
DEBUG或TRACE,输出完整调试信息,便于问题定位 - 生产环境:通常设置为
WARN或ERROR,仅记录异常与关键信息,避免日志文件过大占用磁盘,同时降低 IO 对性能的影响
3 ~> 日志库封装的核心价值(与 std::cout 对比)
3.1 日志级别管理能力
- 专业日志库:原生支持多级日志级别与全局过滤机制,可通过配置动态控制输出范围,适配不同运行环境
std::cout:无内置级别管理能力,所有输出无差别打印,无法通过全局配置灵活控制输出内容,手动封装级别逻辑开发成本高
3.2 标准化日志格式化
- 专业日志库:内置灵活的格式化配置,可自动附加时间戳、日志级别、线程 ID、文件名、行号等上下文信息
- 标准格式示例:
[2025-09-24 10:00:00][INFO][main.cpp:123] This is an info message - 价值:结构化日志可帮助开发者快速定位问题发生的位置与上下文
- 标准格式示例:
std::cout:无内置格式化能力,时间戳、文件行号等信息需手动拼接,代码冗余且易出错,格式一致性难以保障
3.3 日志存储与生命周期管理
- 专业日志库:支持多目标同时输出,原生支持日志文件轮转(按时间 / 按文件大小)、压缩、归档等能力,可自动管理日志生命周期,避免单文件过大导致磁盘空间不足
std::cout:仅支持控制台输出,无法直接落地到文件,不具备文件轮转、归档等管理能力,持久化能力需开发者手动实现
3.4 多线程线程安全保障
- 专业日志库:内置互斥锁等同步机制,保障多线程并发写入时日志内容完整、无乱序、无数据错乱
std::cout:非线程安全,多线程并发输出时会出现日志内容交错、乱码等问题,需开发者手动实现同步逻辑
3.5 运行性能优化
- 专业日志库:通常做了深度性能优化,支持异步写入、缓冲区批量刷盘等机制,减少 IO 阻塞对业务线程的性能影响
std::cout:同步阻塞 IO,每次输出都会阻塞当前线程,高频打印场景下会显著拖累程序性能
4 ~> 项目落地:spdlog 日志库封装方案
4.1 技术选型说明
- 选型:采用开源高性能 C++ 日志库 spdlog 作为底层日志核心
- 修正说明:spdlog 为社区开源项目(gabime/spdlog),并非 Google 出品,是 C++ 生态中应用最广泛的头文件式高性能日志库之一
4.2 封装设计:单例模式
- 封装模式:采用单例模式对 spdlog 进行二次封装,全局维护唯一日志实例,统一管理日志配置与输出入口
- 封装目标:屏蔽底层库的调用细节,提供统一、简洁的日志调用接口,降低项目接入成本,同时便于后续替换底层日志实现
4.3 典型业务日志埋点场景
- 正常流程埋点:API-Key 配置成功、基础 URL 生成成功、模型初始化完成
- 异常流程埋点:会话创建失败、资源加载异常、网络请求失败
- 落地价值:通过日志可完整追溯业务流程执行状态,故障时可快速定位失败环节
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!"
"技术之路难免有困惑,但同行的人会让前进更有方向。" |
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!
往期回顾:
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
