#include <iostream>
#include <sys/time.h>
#include <sstream>
#include <streambuf>
class logger {
protected:
std::string Head(const char* level, const char* filename, const char* function, int line){
struct timeval tv_;
::gettimeofday(&tv_, 0);
char mbstr[32];
std::strftime(mbstr,sizeof(mbstr),"%Y-%m-%d %H:%M:%S",std::localtime(&tv_.tv_sec));
std::stringstream ss;
ss << "[" << level << "]" << "["<<mbstr<<"."<<tv_.tv_usec/1000<<" "<< filename << ":" <<function<<":"<<line<<"] ";
return ss.str();
}
public:
void SetStreambuf(std::basic_streambuf<char> *streambuf) {
stream_.rdbuf(streambuf);
}
void OpenHead() { add_head_flag_ = true; }
void CloseHead() { add_head_flag_ = false; }
static logger* GetLogger() {
static logger log;
return &log;
}
std::ostream& handle(const char* level, const char* filename, const char* function, int line) {
if (!add_head_flag_) {
return stream_;
}
return stream_ << Head(level,filename,function,line);
}
private:
logger() : add_head_flag_(true), stream_(nullptr) {
stream_.rdbuf(std::cout.rdbuf());
}
std::ostream stream_;
bool add_head_flag_;
};
#define LOG(level, msg...) logger::GetLogger()->handle(#level,__FILE__,__FUNCTION__,__LINE__) << msg
#define INFO(msg...) LOG(INFO,msg)
#define ERROR(msg...) LOG(ERROR,msg)
#define WARN(msg...) LOG(WARN,msg)
int main()
{
INFO("hello" << " " << "world " << 233 << std::endl);
INFO("Go : ") << "zhaolu " << '!' << std::endl;
return 0;
}
C++ 日志输出(初级)
最新推荐文章于 2024-08-26 15:28:02 发布