0

0

C++如何实现一个简单的日志库?(代码示例)

穿越時空

穿越時空

发布时间:2025-12-14 20:21:07

|

185人浏览过

|

来源于php中文网

原创

轻量C++日志库核心为LogStream与Logger类,支持流式链式调用(如LOG_INFO

c++如何实现一个简单的日志库?(代码示例)

用C++写一个轻量日志库,核心是控制输出格式、线程安全和可配置性。不需要依赖第三方,标准库 + 少量封装就能搞定。

基础结构:LogStream + Logger类

把日志消息组装成字符串再统一输出,避免频繁调用std::coutfprintf。用类似std::ostringstream的流式接口,支持链式写法:

LOG_INFO << "User login: " << username << ", id=" << uid;

实现上可以封装一个LogStream类,内部持有一个std::stringstream,重载操作符;再配一个全局Logger单例管理级别、输出目标(文件/控制台)、格式前缀(时间、级别、线程ID)。

日志级别与开关控制

定义几个常用级别(DEBUG、INFO、WARN、ERROR),通过宏在编译期或运行期控制是否编译/输出:

立即学习C++免费学习笔记(深入)”;

动感购物HTML
动感购物HTML

修正了V1.10的一些BUG感购物HTML系统是集合目前网络所有购物系统为参考而开发,代码采用DIV编号,不管从速度还是安全我们都努力做到最好,此版虽为免费版但是功能齐全,无任何错误,特点有:专业的、全面的电子商务解决方案,使您可以轻松实现网上销售;自助式开放性的数据平台,为您提供充满个性化的设计空间;功能全面、操作简单的远程管理系统,让您在家中也可实现正常销售管理;严谨实用的全新商品数据库,便于

下载
  • constexprenum class定义级别值,比如INFO = 2
  • 全局设置最低输出级别(如setLogLevel(INFO)),低于该级别的日志直接丢弃
  • 推荐用宏封装,避免无用字符串拼接开销:#define LOG_INFO if (Logger::instance().level()

线程安全与异步写入(可选进阶)

多线程下直接std::cout 可能乱序或阻塞。简单做法是加std::mutex保护输出;更高效的是“异步日志”:LogStream只负责快速入队(用无锁队列或带锁队列),后台线程批量刷盘。

入门版建议先用互斥锁:

std::lock_guard lock(mutex_);
output_ << formatHeader(level) << msg.str() << '\n';

输出到文件 + 自动滚动(实用增强)

std::ofstream打开文件,配合简单滚动逻辑(如按大小或天数):

  • 记录当前文件大小,超限(如10MB)就关闭旧文件,重命名(app.log.20240515.1),新建app.log
  • std::chrono::system_clock::now()获取日期,每天零点自动切文件
  • 注意:文件操作需加锁,且避免在信号处理中调用(如SIGUSR1触发刷新)

基本上就这些。不复杂但容易忽略细节——比如忘记加换行、没处理std::endl导致缓冲区不刷、多线程下格式串和实际数据错位。从同步+控制台开始,跑通再加文件和异步,迭代更稳。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

335

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

757

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

288

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.2万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号