C++ 基于宏实现日志 (参考squid 日志)
话不多说,先上代码。
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <thread>
#include <sys/types.h>
enum status
{
debug = 0,
info,
warn,
fatal,
error,
};
struct level
{
const char *Info;
status sta;
};
class logger
{
public:
logger(const char *function, const char *filename, int line, const char *date, const level* lev) : mfunction(function), mfilename(filename), mline(line), mdate(date), mlev(lev)
{
// std::cout << *this << std::endl;
}
logger(const logger& log){
this->mdate = log.mdate;
this->mfilename=log.mfilename;
this->mfunction= log.mfunction;
this->mlev=log.mlev;
this->mline= log.mline;
}
logger(const logger&& log){
this->mdate = log.mdate;
this->mfilename=log.mfilename;
this->mfunction= log.mfunction;
this->mlev=log.mlev;
this->mline= log.mline;
}
friend std::ostream &operator<<(std::ostream &os, const logger &log)
{
if (log.mlev->sta == 0)
{
os << getppid() << " "
<< "[DEBUG] " << log.mdate << log.mfilename << " " << log.mfunction << " " << log.mline << " "
<< " : " << log.mlev->Info;
return os;
}
else if (log.mlev->sta == 1)
{
os << getppid() << " "
<< "[INFO] " << log.mdate << log.mfilename << " " << log.mfunction << " " << log.mline << " "
<< " : " << log.mlev->Info;
return os;
}
else if (log.mlev->sta == 2)
{
os << getppid() << " "
<< "[WARN] " << log.mdate << log.mfilename << " " << log.mfunction << " " << log.mline << " "
<< " : " << log.mlev->Info;
return os;
}
else if (log.mlev->sta == 4)
{
os << getppid() << " "
<< "[ERROR] " << log.mdate << log.mfilename << " " << log.mfunction << " " << log.mline << " "
<< " : " << log.mlev->Info;
return os;
}
else
{
os << "[FATAL] " << log.mdate << log.mfilename << " " << log.mfunction << " " << log.mline << " "
<< " : " << log.mlev->Info;
return os;
}
}
~logger() {
//delete mlev;
}
private:
const char *mfilename;
int mline;
const char *mfunction;
const char *mdate;
const level *mlev;
};
#define here(X) logger(__FUNCTION__, __FILE__, __LINE__, __DATE__, (X))
#define INFO status::info
#define WARN status::warn
#define ERROR status::error
#define FATAL status::fatal
#define DEBUG status::debug
int a = 100;
void test()
{
const level l1 = {"nihao", DEBUG};
const level *ptrl1=&l1;
std::cout << here(ptrl1) << std::endl;
}
void test2()
{
const char *ni("oh hou~");
const level l2 = {ni, INFO};
const level *ptrl2=&l2;
std::cout << here(ptrl2) << std::endl;
}
int main()
{
test2();
std::thread t(test);
sleep(10);
t.join();
return 0;
}
编译运行
还是比较简单的,方便理解c/c++基础日志库的实现,大家也可以尝试封装下自己的日志库哦~
本文来自博客园,作者:{心亘久},转载请注明原文链接:https://www.cnblogs.com/zhaodejin/p/16011922.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix