以下是一个基本的多线程打印日志的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 函数中打印了一些日志,然后启动了一个工作线程,在工作线程中也打印了一些日志。这些日志信息包含了相应的模块名,方便我们区分不同的日志来源。

一个基本的多线程打印日志的C++代码它将信息打印到控制台并包含文件名、行号、参数列表、日志级别和模块信息其中模块信息可选

原文地址: https://www.cveoy.top/t/topic/bYCx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录