C++ 基於巨集實現日誌 (參考squid 日誌)
阿新 • • 發佈:2022-03-16
話不多說,先上程式碼。
#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; }