#include <iostream>
#include <fstream>
#include <sstream>
#include <ctime>
enum MyLogLevel {
LOG_INFO,
LOG_DBG,
LOG_WARNING,
LOG_ERROR,
LOG_CRITICAL
};
class MyLogger {
public:
static MyLogger& GetInstance(MyLogLevel level = LOG_INFO) {
static MyLogger instance(level);
return instance;
}
MyLogger(MyLogger const&) = delete;
void operator=(MyLogger const&) = delete;
template<typename... Args>
void Log(MyLogLevel level, const std::string& format, Args... args) {
if (level >= level_) {
std::time_t now = std::time(nullptr);
char time_str[20];
std::strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
file_ << "[" << time_str << "] ";
switch (level) {
case LOG_INFO:
file_ << "[INFO] ";
break;
case LOG_DBG:
file_ << "[DEBUG] ";
break;
case LOG_WARNING:
file_ << "[WARNING] ";
break;
case LOG_ERROR:
file_ << "[ERROR] ";
break;
case LOG_CRITICAL:
file_ << "[CRITICAL] ";
break;
}
std::stringstream ss;
ss << format;
log_impl(ss, args...);
file_ << ss.str() << std::endl;
}
}
void SetLevel(MyLogLevel level) {
level_ = level;
}
private:
MyLogger(MyLogLevel level) : level_(level) {
file_.open("main.log", std::ios::out | std::ios::app);
}
~MyLogger() {
file_.close();
}
template<typename T, typename... Args>
void log_impl(std::stringstream& ss, T value, Args... args) {
ss << value;
log_impl(ss, args...);
}
void log_impl(std::stringstream& ss) {}
MyLogLevel level_;
std::ofstream file_;
};
使用
MyLogger& logger = MyLogger::GetInstance(LOG_WARNING);
logger.Log(LOG_INFO, __FILE__, " " , __LINE__, " ", "hello world");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)