- 使用格式化字符的方式!
- 在写宏的代码时,分多行的话,每行的末尾都要加,且的后面不能加空格。
- 我们系统的变量很多都写_开头,我们书写定义成员变量把_放在末尾,去和系统的变量不产生冲突,而且为了区分函数内的变量(局部变量)。
我们创建Logger.h
#pragma once #include#include "noncopyable.h" //LOG_INFO("%s %d", arg1, arg2) //__VA_ARGS__获取可变参的宏 //logmsgFormat:字符串,后面...是可变参 #define LOG_INFO(logmsgFormat, ...) do { Logger &logger = Logger::instance(); logger.setLogLevel(INFO); char buf[1024] = {0}; snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); logger.log(buf); } while(0) #define LOG_ERROR(logmsgFormat, ...) do { Logger &logger = Logger::instance(); logger.setLogLevel(ERROR); char buf[1024] = {0}; snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); logger.log(buf); } while(0) #define LOG_FATAL(logmsgFormat, ...) do { Logger &logger = Logger::instance(); logger.setLogLevel(FATAL); char buf[1024] = {0}; snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); logger.log(buf); exit(-1); } while(0) #ifdef MUDEBUG #define LOG_DEBUG(logmsgFormat, ...) do { Logger &logger = Logger::instance(); logger.setLogLevel(DEBUG); char buf[1024] = {0}; snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); logger.log(buf); } while(0) #else #define LOG_DEBUG(logmsgFormat, ...) #endif //定义日志的级别 INFO(正常的日志输出) ERROR(错误,不影响软件继续向下执行) // FATAL(毁灭性的打击,系统无法正常向下运行) DEBUG(调试信息,一般是关闭的) enum LogLevel { INFO, //普通信息 ERROR,//错误信息 FATAL,//core信息 DEBUG,//调试信息 }; //输出一个日志类 class Logger : noncopyable { public: //获取日志唯一的实例对象 static Logger& instance(); //设置日志级别 void setLogLevel(int level); //写日志 void log(std::string msg); private: int logLevel_; };
Timestamp里面有两个重要的方法:
now():获取当前时间
使用int64_t的长整型microSecondsSinceEpoch变量来存储的!
tostring():将长整型时间microSecondsSinceEpoch进行转换,转换成年月日,时分秒
DEBUG调试信息会非常多,对调试信息一般运行起来,默认是关闭的,通过宏来进行打开 :
定义了MUDEBUG就正常输出调试信息,没有定义MUDEBUG就输出为空!
#include "Logger.h" #include "Timestamp.h" #include//获取日志唯一的实例对象 Logger& Logger::instance() { static Logger logger; return logger; } //设置日志级别 void Logger::setLogLevel(int level) { logLevel_ = level; } //写日志 [级别信息] time : msg void Logger::log(std::string msg) { switch (logLevel_) { case INFO: std::cout << "[INFO]"; break; case ERROR: std::cout << "[ERROR]"; break; case FATAL: std::cout << "[FATAL]"; break; case DEBUG: std::cout << "[DEBUG]"; break; default: break; } //打印时间和msg std::cout << Timestamp::now().toString() << " : " << msg << std::endl; }



