Newer
Older
CasicIrisIdentify / utils / LogUtil.h
#ifndef LOGUTIL_H
#define LOGUTIL_H

#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"

#include "SettingConfig.h"

// use embedded macro to support file and line number
#define LOG_TRACE(...) SPDLOG_LOGGER_CALL(LogUtil::getInstance()->getLogger().get(), spdlog::level::trace, __VA_ARGS__)
#define LOG_DEBUG(...) SPDLOG_LOGGER_CALL(LogUtil::getInstance()->getLogger().get(), spdlog::level::debug, __VA_ARGS__)
#define LOG_INFO(...) SPDLOG_LOGGER_CALL(LogUtil::getInstance()->getLogger().get(), spdlog::level::info, __VA_ARGS__)
#define LOG_WARN(...) SPDLOG_LOGGER_CALL(LogUtil::getInstance()->getLogger().get(), spdlog::level::warn, __VA_ARGS__)
#define LOG_ERROR(...) SPDLOG_LOGGER_CALL(LogUtil::getInstance()->getLogger().get(), spdlog::level::err, __VA_ARGS__)


class LogUtil
{
public:
    ~LogUtil()
    {
        spdlog::drop_all();
    }

    LogUtil(const LogUtil&)=delete;
    LogUtil& operator=(const LogUtil&)=delete; //禁止生成默认赋值函数

    // magic singleton static
    static LogUtil* getInstance() {
        static LogUtil instance;
        return &instance;
    }

    std::shared_ptr<spdlog::logger> getLogger()
    {
        return m_logger;
    }

private:
    LogUtil()
    {
        try {

            // Create a daily logger - a new file is created every day on 00:00am
            m_logger = spdlog::daily_logger_mt("CasicIrisIdentify", SettingConfig::getInstance().LOG_FILE.toStdString(), 0, 0);

            m_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%l] %v");

            std::string level = SettingConfig::getInstance().LOG_LEVEL.toStdString();
            if (level == "trace")
            {
                m_logger->set_level(spdlog::level::trace);
                m_logger->flush_on(spdlog::level::trace);
            }
            else if (level == "debug")
            {
                m_logger->set_level(spdlog::level::debug);
                m_logger->flush_on(spdlog::level::debug);
            }
            else if (level == "info")
            {
                m_logger->set_level(spdlog::level::info);
                m_logger->flush_on(spdlog::level::info);
            }
            else if (level == "warn")
            {
                m_logger->set_level(spdlog::level::warn);
                m_logger->flush_on(spdlog::level::warn);
            }
            else if (level == "error")
            {
                m_logger->set_level(spdlog::level::err);
                m_logger->flush_on(spdlog::level::err);
            }
        }
        catch (const spdlog::spdlog_ex& ex)
        {
            spdlog::error("init log failed: {}",ex.what());

        }
    }

    std::shared_ptr<spdlog::logger> m_logger;

};

#endif // LOGUTIL_H