1. 程式人生 > 其它 >C++ 基於巨集實現日誌 (參考squid 日誌)

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++基礎日誌庫的實現,大家也可以嘗試封裝下自己的日誌庫哦~