-
C++
实现简易
log
日志系统
日志的作用
在软件开发周期中,
不管是前台还是后台,
系统一般会采用一个
持久化的日志系统来记
录运行情况。
在代码中嵌入
log
代码信息,主要记录下列信息:
(
1
)记录系统运行异常信息。
(
2
)记录系统运行状态信息。
<
/p>
(
3
)记录系统运行性能指标。
通过对上述信息
分析和诊断,
我们能采取正确的手段来提高系统质量和系统性能。
由此
可见
log
日志在系统中的重要
地位和存在的必要性。
日志的类型与级别
2.1
日志的类型
主要分三大类:
安全类信息:记录系统边界交互行为和信息;
业务类信息:记录系统内部业务处理行为和信息
;
性能类信息:记录系统硬件对业务处理的支撑能力。
2.2
日志的类型
一般分五级:
ERROR
(错误)
:
此信息输出
后,
主体系统核心模块不能正常工作,
需要修复才能正常工作。
WARN
(警告)
:此信息输出后,系统一般模块存在问题,不影响系统运行。
< br>
INFO
(通知)
:此信息输出后,主要是记录系统运行状态等关联信息。
DEBUG
(调试)
:最细粒度的输出,除却上面各
种情况后,你希望输出的相关信息,都可以
在这里输出。
TRACE
(跟踪)
:最细粒度的输出,除却上面各种情况后,你希望输出的相关信息,都可以
在这
里输出。
在本文实现的简单日志系
统中不包括
DEBUG
和
TRACE<
/p>
。
DEBUG
在编码过程中进行,
TRACE
不太需要。
2.3
常见的开源
< br>log
工具
C/C++
实现的开源
log
常见有:
C++
版的
log4j
p>
的
log4cplus
、
< br>快速的
C++
日志库——<
/p>
spdlog
、
纯
C
日志函数库
——
zlog
、
C++
日志框架—
—
Google Glog
等。
其中开源
log
工具
log4cplus
在项目中的使用较为常见,具体用
法和源码请参考网络的
资源,不再赘述。
3.
自实现
log
工具
主要针对
ERROR
(错误)
、
p>
WARN
(警告)和
INFO
(通知)这三种日志类型实现了如下
的
C++
简易
log
工具。由源文件(
)和头文件(
logger.h
)组成。源码如下。
logger.h
文件:
/*
* logger.h
* brief
日记模块
1
*/
#ifndef
__logger__
#define
__logger__
#include
#include
#include
#include
#include
#include
///
/// brief
日志文件的类型
///
typedef enum log_rank {
INFO,
WARNING,
ERROR,
FATAL
}log_rank_t;
///
/// brief
初始化日志文件
/// param info_log_filename
信息文件的名字
/// param
warn_log_filename
警告文件的名字
/// param error_log_filename
错误文件的名字
void
initLogger(const std::string& info_log_filename,
const std::string& warn_log_filename,
const std::string& error_log_filename);
///
/// brief
日志系统类
///
class Logger {
friend void
initLogger(const std::string& info_log_filename,
const std::string& warn_log_filename,
const std::string& erro_log_filename);
public:
//
构造函数
Logger(log_rank_t log_rank) :
m_log_rank(log_rank) {};
~Logger();
2
///
/// brief
写入日志信息之前先写入的源代码文件名
,
行号
,
函数名
/// param
log_rank
日志的等级
///
param line
日志发生的行号
/// param function
日志发生的函数
static std::ostream& start(log_rank_t
log_rank,
const int32 line,
const
std::string& function);
private:
///
///
brief
根据等级获取相应的日志输出流
///
static std::ostream&
getStream(log_rank_t log_rank);
static std::ofstream m_info_log_file;
static std::ofstream m_warn_log_file;
static std::ofstream m_error_log_file;
log_rank_t m_log_rank;
};
///
/// brief
根据不同等级进行用不同的输出流进行读写
///
#define LOG(log_rank)
Logger(log_rank).start(log_rank,
__LINE__, __FUNCTION__)
///
/// brief
利用日记进行检查的各种宏
///
#define CHECK(a)
if(!(a)) {
LOG(ERROR) <<
<< #a <<
abort();
}
#define CHECK_NOTNULL(a)
if( NULL ==
(a)) {
LOG(ERROR) <<
<< #a <<
abort();
}
3
///<
信息日子的输出流
///<
警告信息的输出流
///<
错误信息的输出流
///<
日志的信息的等级
-
-
-
-
-
-
-
-
-
上一篇:对数公式总结
下一篇:log对数表.doc