c++11 超简单日志库(不到100行),字符流格式输出
- 全部代码
#include <iostream>
#include <sstream>
#include <chrono>
#include <thread>
using namespace std;
// 获取当时系统时间
const std::string GetCurrentSystemTime()
{
auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
struct tm* ptm = localtime(&t);
char date[60] = { 0 };
sprintf(date, "%d-%02d-%02d %02d:%02d:%02d",
(int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday,
(int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec);
return std::move(std::string(date));
}
class Loger
{
public:
Loger(string level, const char* file, int len, unsigned int line) : loglevel(level), _buf_stream()
{
_buf_stream << "[" << GetCurrentSystemTime() << "] " // 当前时间 2022-03-31 17:27:09
<< "[" << this_thread::get_id() << "] " // 线程id
<< "[" << level << "] " // 日志级别
<< "[" << string(file, len) << "] " // 文件路径
<< "[" << line << "] "; // 行号
}
~Loger() { Flush(); }
template <typename T>
Loger& operator << (T const& t)
{
_buf_stream << t;
return *this;
}
std::stringstream& stream() { return _buf_stream; }
void Flush()
{
//真正输出到屏幕(cout),并换行(endl)
cout << _buf_stream.str() << endl;
_buf_stream.str(""); // 输出后就不能再留着了
_buf_stream.clear(); // 清除可能的出错标志位
}
private:
std::stringstream _buf_stream; // 字符串流,相当于内存流,用来缓存
string loglevel;
};
#define LOG_STREAM(lv) Loger(lv,__FILE__,sizeof(__FILE__) - 1,__LINE__).stream()
#define log_debug LOG_STREAM("debug")
#define log_info LOG_STREAM("info")
#define log_warning LOG_STREAM("warning")
#define log_error LOG_STREAM("error")
#define log_fatal LOG_STREAM("fatal")
int main()
{
log_debug << "debug ip:127.0.0.1," << "port:" << 8888;
log_info << "info ip:127.0.0.1," << "port:" << 8888;
log_warning << "warning ip:127.0.0.1," << "port:" << 8888;
log_error << "error ip:127.0.0.1," << "port:" << 8888;
log_fatal << "fatal ip:127.0.0.1," << "port:" << 8888;
}
- 控制台打印输出效果
[2022-03-31 17:46:26] [1] [debug] [/home/hyd/projects/mylog520/main.cpp] [66] debug ip:127.0.0.1,port:8888
[2022-03-31 17:46:26] [1] [info] [/home/hyd/projects/mylog520/main.cpp] [67] info ip:127.0.0.1,port:8888
[2022-03-31 17:46:26] [1] [warning] [/home/hyd/projects/mylog520/main.cpp] [68] warning ip:127.0.0.1,port:8888
[2022-03-31 17:46:26] [1] [error] [/home/hyd/projects/mylog520/main.cpp] [69] error ip:127.0.0.1,port:8888
[2022-03-31 17:46:26] [1] [fatal] [/home/hyd/projects/mylog520/main.cpp] [70] fatal ip:127.0.0.1,port:8888
参考.