基本概念:
日志可以记录正常软件运行过程中出现的信息和错误的信息,当我们定位问题,就打开相应的日志去查看,查找;
日志的作用:
在软件开发周期中,不管是前台后台,系统一般会采用一个持久化的日志系统来记录运行情况。
在代码中嵌入log代码信息,主要记录下列信息:
(1)系统运行异常信息。
(2)系统运行状态信息。
(3)系统运行性能指标。
日志级别:
一般分5个级别:
- ERROR(错误):此信息输出后,主体系统核心模块不能正常工作,需要修复才能正常工作。
- WARN(警告):此信息输出后,系统一般模块存在问题,不影响系统运行。
- INFO(通知):此信息输出后,主要是记录系统运行状态等关联信息。
- DEBUG(调试):最细粒度的输出,除却上面各种情况后,你希望输出的相关信息,都可以在这里输出。
- TRACE(跟踪):最细粒度的输出,除却上面各种情况后,你希望输出的相关信息,都可以在这里输出。
logger日志系统的实现:
- 在src下的include增加头文件:logger.h;
- 将logger.h,logger.cpp添加到项目中;
- 设置logger.cpp的预编译头选项为“不使用预编译头”;
- 即一个自实现的日志文件系统,由log.h和log.cpp构成
在log.h文件中定义宏:
//定义宏 LOG_INFO("xxx %d %s", 20, "xxxx")
//可变参,提供给用户更轻松的使用logger
#if(ENABLE_LOGGING)
#define log_info() Logger(Logger::LogLevel::Info)
#define log_warning() Logger(Logger::LogLevel::Warning, "Warning")
#define log_error() Logger(Logger::LogLevel::Error, "Error")
#define log_debug() Logger(Logger::LogLevel::Debug, "DEBUG", __FILE__, __LINE__)
#define log_noendl Logger::Noendl()
#define log_nospace Logger::Nospace()
#else
#define log_info() NoLogger()
#define log_warning() NoLogger()
#define log_error() NoLogger()
#define log_debug() NoLogger()
#define log_noendl 0
#define log_nospace 0
class NoLogger
{
public:
template<typename T>
NoLogger& operator<<(const T& val) { return *this; }
};
#endif
在log.h文件中创建类Logger:
class Logger //记录分析日志
{
public:
enum LogLevel //枚举,用来设置不同的日志级别
{
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL,
NUM_LOG_LEVELS,//级别个数
};