0

0

c++如何实现一个简单的日志库 _c++日志库实现方法

下次还敢

下次还敢

发布时间:2025-10-17 19:39:01

|

739人浏览过

|

来源于php中文网

原创

答案:实现了一个支持分级、线程安全、可输出到控制台或文件的C++单例日志库,通过宏简化调用。

c++如何实现一个简单的日志库 _c++日志库实现方法

实现一个简单的C++日志库,核心目标是让程序在运行过程中输出结构化的调试、警告或错误信息,并支持输出到控制台或文件。下面是一个轻量级但实用的日志系统实现方法。

1. 定义日志级别

日志通常需要区分严重程度。可以使用枚举定义几个常见级别:

enum class LogLevel {
    DEBUG,
    INFO,
    WARNING,
    ERROR
};

这样可以在输出时根据级别决定是否显示,或用不同颜色/格式标识。

2. 设计日志输出接口

创建一个简单的Logger类,提供基础的写日志方法:

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

class Logger {
public:
    static Logger& instance() {
        static Logger logger;
        return logger;
    }
void setLevel(LogLevel level) {
    m_level = level;
}

void log(LogLevel level, const std::string& msg) {
    if (level >= m_level) {
        std::lock_guardzuojiankuohaophpcnstd::mutexyoujiankuohaophpcn lock(m_mutex);
        std::cout zuojiankuohaophpcnzuojiankuohaophpcn "[" zuojiankuohaophpcnzuojiankuohaophpcn toString(level) zuojiankuohaophpcnzuojiankuohaophpcn "] " 
                  zuojiankuohaophpcnzuojiankuohaophpcn msg zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
    }
}

private: LogLevel m_level = LogLevel::DEBUG; std::mutex m_mutex;

const char* toString(LogLevel level) {
    switch (level) {
        case LogLevel::DEBUG:   return "DEBUG";
        case LogLevel::INFO:    return "INFO";
        case LogLevel::WARNING: return "WARNING";
        case LogLevel::ERROR:   return "ERROR";
        default:                return "UNKNOWN";
    }
}

};

使用单例模式保证全局只有一个日志实例,避免多线程冲突。通过setLevel可动态调整最低输出级别。

3. 添加便捷宏定义

为了方便调用,可以封装几个宏:

#define LOG_DEBUG(msg) Logger::instance().log(LogLevel::DEBUG, msg)
#define LOG_INFO(msg)  Logger::instance().log(LogLevel::INFO, msg)
#define LOG_WARNING(msg) Logger::instance().log(LogLevel::WARNING, msg)
#define LOG_ERROR(msg) Logger::instance().log(LogLevel::ERROR, msg)

这样在代码中就可以像这样使用:

宣小二
宣小二

宣小二:媒体发稿平台,自媒体发稿平台,短视频矩阵发布平台,基于AI驱动的企业自助式投放平台。

下载
LOG_INFO("程序启动成功");
LOG_DEBUG("当前用户数: 5");

4. 支持输出到文件(可选扩展)

可以在Logger中添加文件输出功能:

void setLogFile(const std::string& filename) {
    m_file.open(filename, std::ios::app);
}

然后在log函数中同时写入文件(如果已打开):

if (m_file.is_open()) {
    m_file << "[" << toString(level) << "] " << msg << std::endl;
    m_file.flush(); // 立即写入
}

调用方式:Logger::instance().setLogFile("app.log");

总结

这个简易日志库实现了基本的日志分级、线程安全输出、控制台和文件双写能力。虽然功能不如spdlog或glog强大,但足够用于学习或小型项目。后续可扩展时间戳、异步写入、格式化参数等功能。

基本上就这些,不复杂但容易忽略细节,比如加锁和级别过滤。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1027

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

455

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

61

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

热门下载

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

精品课程

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

共578课时 | 48.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

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

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