C++多线程日志类-创新互联

#ifndef LOGGER_H
#define LOGGER_H

#include#include#include#includeclass Logger
{
public:
    enum class LogLevel
    {
        ERROR,
        INFO,
        DEBUG
    };

    typedef struct _stLogInfo
    {
        std::string info;
        LogLevel level;
    }stLogInfo;

private:
    Logger();
    ~Logger();
    static void createInstance();

    std::string getLogLevelString(LogLevel level);
    void processEntries();
    void setLogFile(std::string file);
    std::string getLogFile();
    std::string getFileName();
public:
    static Logger* getInstance();

    Logger(const Logger& obj) = delete ;
    Logger& operator=(const Logger& obj) = delete ;

    void setLogLevel(LogLevel level);
    void log(std::string entry,LogLevel level);

private:
    static Logger* m_pInstance;
    std::mutex m_mutex;
    std::condition_variable m_condVar;
    std::queuem_queue;
    std::thread m_thread;
    bool m_bExit;
    LogLevel m_logLevel = LogLevel::ERROR;
    std::string m_logFile;

    class DestoryPtr
    {
    public:
        ~DestoryPtr()
        {
            if(Logger::m_pInstance)
            {
                delete  Logger::m_pInstance;
                Logger::m_pInstance = nullptr;
            }
        }
    };
};

#endif // LOGGER_H

创新互联公司是一家专业提供巴林左旗企业网站建设,专注与网站设计、成都网站建设H5技术、小程序制作等业务。10年已为巴林左旗众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
#include "logger.h"
#include#include#include#includeusing namespace std;

Logger* Logger::m_pInstance = nullptr;
once_flag g_flag;

Logger::Logger()
    :m_bExit(false)
{
    m_thread = thread(&Logger::processEntries,this);
}

Logger::~Logger()
{
    {
        unique_locklock(m_mutex);
        m_bExit = true;
        m_condVar.notify_all();
    }

    m_thread.detach();
}

void Logger::createInstance()
{
    m_pInstance = new Logger;
    static DestoryPtr desPtr;
}

std::string Logger::getLogLevelString(Logger::LogLevel level)
{
    switch (level)
    {
    case LogLevel::ERROR:
        return "ERROR";
    case LogLevel::INFO:
        return  "INFO";
    case LogLevel::DEBUG:
        return  "DEBUG";
    }

    return "Invalid log level";
}

Logger *Logger::getInstance()
{
    call_once(g_flag,createInstance);
    return m_pInstance;
}

void Logger::setLogLevel(LogLevel level)
{
    m_logLevel = level;
}

void Logger::processEntries()
{
    string file = getFileName();

    ofstream logFile(file,ios::app);
    if(logFile.fail())
    {
        //cout<lock(m_mutex);
    while(true)
    {
        if(!m_bExit)
            m_condVar.wait(lock);

        lock.unlock();

        while (true)
        {
            lock.lock();
            if(m_queue.empty())
                break;
            else
            {
                file = getFileName();
                if(strcmp(file.c_str(),m_logFile.c_str()) != 0)
                {
                    logFile.close();
                    logFile.open(file,ios::app);
                    if(logFile.fail())
                    {
                        return;
                    }

                    setLogFile(file);
                }

                logFile<<"["<< __TIME__<<"]-->";
                logFile<<"["<lock(m_mutex);
    if(level >m_logLevel)
        return;

    stInfo.info = entry;
    stInfo.level = level;
    m_queue.push(stInfo);

    m_condVar.notify_all();
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:C++多线程日志类-创新互联
标题链接:http://scyanting.com/article/dogihe.html