首页 > 后端开发 > C++ > 正文

c++怎么实现一个简单的日志系统_c++日志系统实现方法

尼克
发布: 2025-10-11 14:19:03
原创
548人浏览过
首先定义日志级别枚举,再通过单例Logger类封装输出逻辑,支持控制台和文件双端输出,结合互斥锁保证线程安全,使用宏实现简洁调用,最终实现带时间戳、级别过滤和多目标输出的基础日志系统。

c++怎么实现一个简单的日志系统_c++日志系统实现方法

实现一个简单的C++日志系统,关键在于封装输出逻辑、支持不同日志级别、线程安全和可扩展性。下面是一个基础但实用的日志系统实现方法。

定义日志级别

首先定义常见的日志级别,便于控制输出信息的详细程度:

enum class LogLevel {
    DEBUG,
    INFO,
    WARNING,
    ERROR
};
登录后复制

封装日志类

创建一个单例风格的Logger类,管理日志输出目标(如控制台或文件)和当前级别过滤:

#include <iostream>
#include <fstream>
#include <string>
#include <mutex>
#include <ctime>

class Logger {
public:
    static Logger& instance() {
        static Logger logger;
        return logger;
    }

    void setLevel(LogLevel level) {
        m_level = level;
    }

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

    void log(LogLevel level, const std::string& msg) {
        if (level < m_level) return;

        std::lock_guard<std::mutex> lock(m_mutex);
        std::time_t now = std::time(nullptr);
        char timeStr[64];
        std::strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", std::localtime(&now));

        std::string levelStr[] = {"DEBUG", "INFO", "WARNING", "ERROR"};
        std::string line = "[" + std::string(timeStr) + "] [" + levelStr[static_cast<int>(level)] + "] " + msg + "\n";

        std::cout << line;
        if (m_file.is_open()) {
            m_file << line;
            m_file.flush();
        }
    }

private:
    Logger() : m_level(LogLevel::DEBUG) {}
    ~Logger() {
        if (m_file.is_open()) m_file.close();
    }

    LogLevel m_level;
    std::ofstream m_file;
    std::mutex m_mutex;
};
登录后复制

提供便捷宏接口

使用宏简化调用,自动传入级别并支持流式写法:

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

PhotoG
PhotoG

PhotoG是全球首个内容营销端对端智能体

PhotoG 121
查看详情 PhotoG
#define LOG_DEBUG(msg) Logger::instance().log(LogLevel::DEBUG, msg)
#define LOG_INFO(msg)  Logger::instance().log(LogLevel::INFO, msg)
#define LOG_WARN(msg)  Logger::instance().log(LogLevel::WARNING, msg)
#define LOG_ERROR(msg) Logger::instance().log(LogLevel::ERROR, msg)
登录后复制

使用示例

在main函数中设置日志行为并输出信息:

int main() {
    Logger::instance().setLevel(LogLevel::INFO);
    Logger::instance().setFileOutput("app.log");

    LOG_DEBUG("This won't show"); // 被级别过滤
    LOG_INFO("Program started");
    LOG_WARN("Something unusual happened");
    LOG_ERROR("A critical error occurred");

    return 0;
}
登录后复制

这样就实现了基本功能:时间戳、级别控制、控制台与文件双输出、线程安全。后续可扩展格式化、异步写入、滚动文件等功能。

基本上就这些,不复杂但容易忽略细节。

以上就是c++++怎么实现一个简单的日志系统_c++日志系统实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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