c++11 超简单日志库(不到100行),字符流格式输出

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

参考.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值