一个基本的多线程打印日志的C++代码它将信息打印到控制台并包含文件名、行号、参数列表、日志级别和模块信息其中模块信息可选
以下是一个基本的多线程打印日志的C++代码:
#include <iostream>
#include <mutex>
#include <thread>
enum LogLevel {
DEBUG,
INFO,
WARNING,
ERROR
};
std::mutex log_mutex;
void printLog(const char* file, int line, const char* function, LogLevel level, const char* module, const char* format, ...) {
va_list args;
va_start(args, format);
std::lock_guard<std::mutex> lock(log_mutex);
// Get current time
time_t now = time(nullptr);
tm* timeinfo = localtime(&now);
// Print timestamp
std::cout << "[" << timeinfo->tm_year + 1900 << "-"
<< std::setw(2) << std::setfill('0') << timeinfo->tm_mon + 1 << "-"
<< std::setw(2) << std::setfill('0') << timeinfo->tm_mday << " "
<< std::setw(2) << std::setfill('0') << timeinfo->tm_hour << ":"
<< std::setw(2) << std::setfill('0') << timeinfo->tm_min << ":"
<< std::setw(2) << std::setfill('0') << timeinfo->tm_sec << "] ";
// Print filename, line number, function name
std::cout << "[" << file << ":" << line << " " << function << "] ";
// Print log level
switch (level) {
case DEBUG:
std::cout << "[DEBUG] ";
break;
case INFO:
std::cout << "[INFO] ";
break;
case WARNING:
std::cout << "[WARNING] ";
break;
case ERROR:
std::cout << "[ERROR] ";
break;
}
// Print module name
if (module != nullptr) {
std::cout << "[" << module << "] ";
}
// Print log message
vprintf(format, args);
std::cout << std::endl;
va_end(args);
}
#define LOG_DEBUG(module, format, ...) printLog(__FILE__, __LINE__, __FUNCTION__, DEBUG, module, format, ##__VA_ARGS__)
#define LOG_INFO(module, format, ...) printLog(__FILE__, __LINE__, __FUNCTION__, INFO, module, format, ##__VA_ARGS__)
#define LOG_WARNING(module, format, ...) printLog(__FILE__, __LINE__, __FUNCTION__, WARNING, module, format, ##__VA_ARGS__)
#define LOG_ERROR(module, format, ...) printLog(__FILE__, __LINE__, __FUNCTION__, ERROR, module, format, ##__VA_ARGS__)
void worker() {
LOG_DEBUG("worker", "Starting worker thread");
// Do some work
LOG_DEBUG("worker", "Finished worker thread");
}
int main() {
LOG_INFO(nullptr, "Starting program");
std::thread t(worker);
t.join();
LOG_INFO(nullptr, "Exiting program");
return 0;
}
这个代码定义了一个 printLog 函数,它使用可变参数列表来接收日志信息。这个函数使用互斥锁来确保多个线程不会同时写入控制台,同时也包含时间戳、文件名、行号、函数名、日志级别和模块名等信息。
为了方便使用,这个代码还定义了几个宏,分别对应不同的日志级别。这些宏调用 printLog 函数,同时传递相应的参数。
在这个示例中,我们在 main 函数中打印了一些日志,然后启动了一个工作线程,在工作线程中也打印了一些日志。这些日志信息包含了相应的模块名,方便我们区分不同的日志来源。
原文地址: https://www.cveoy.top/t/topic/bYCx 著作权归作者所有。请勿转载和采集!