C++ 日志输出(初级)

#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;
}
发布了258 篇原创文章 · 获赞 13 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/105131348
今日推荐