首先定义日志级别枚举,再通过单例Logger类封装输出逻辑,支持控制台和文件双端输出,结合互斥锁保证线程安全,使用宏实现简洁调用,最终实现带时间戳、级别过滤和多目标输出的基础日志系统。

实现一个简单的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++免费学习笔记(深入)”;
#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++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号