这个也发表在我另一个BLOG:http://imlgc.com/?p=51,这个是发在博客园的。
简介
日志,在一般系统里是非常非常重要的,它不仅跟踪到程序的执行,同时也是对系统进行各方面分析的基础。其重要性在这里不再一一说明,有兴趣可自行GOOGLE之。
日志的实现可以很复杂,功能强大的如java的log4j和移值到C++的log4cpp。当然也可以很简单,就是简单的向控制台打印和写文件。Minilog就是属于这种简单的类型。
特点:
- 跨平台,当然我只测试LINUX和WINDOWS,买不起苹果。
- 提供非常丰富的宏,使用非常方便。
- 没测试过性能,不过估计不会很差。
下载:minilog.zip
minilog.zip文件列表:
文件 | 说明 |
minilog.h | 日志类的头文件 |
minilog.cpp | 日志类的实现文件 |
test.h | 测试框架,可参阅之前写的Very Very Simple C++ Testing Framework |
minilogtest.cpp | 测试文件 |
test.cpp | 测试启动函数,即main函数所在文件 |
实现和使用
Minilog的实现只有一个类,为一单件。为了避免频繁的IO交互,日志先进行缓存,当缓存满或者刷日志时,才进行IO操作。日志级别分别为:ALL, DEBUG, INFO, WARNING, ERROR, FATAL, OFF。ALL级别最低,OFF级别最高。终端日志的输出不缓存,不同的级别输出来同的颜色。
便捷的操作宏。
宏 | 说明 |
LOG_DEBUG | 输出调试日志,DEBUG级别 |
LOG_INFO | 输出消息日志,INFO级别 |
LOG_WARN | 输出警告日志,WARNING级别 |
LOG_ERROR | 输出错误日志,ERROR级别 |
LOG_FATAL | 输出致命日志,FATAL级别 |
SET_LOG_FILE_LEVEL | 设置文件日志级别 |
SET_LOG_CONSOLE_LEVEL | 设置终端日志级别 |
SET_LOG_LEVEL | 设置终端和文件日志级别 |
SET_LOG_PATH | 设置日志的路径 |
SET_LOG_FILE_FIXED | 设置日志的文件名,不加任何修饰 |
SET_LOG_FILE | 设置日志的文件名,加时间和进程号修饰 |
SET_LOG_BUF_SIZE | 设置日志缓冲大小 |
LOG_FLUSH | 刷日志 |
LOG_RELEASE | 释放日志,事实任何事情都不做 |
LOG_IS_READY | 测试日志是否准备 |
原先的单件实现是动态分配内存的,于是有LOG_RELEASE这是写法,但是事实上,当程序退出后,如果没有显式释放,是不会刷日志的,于是采用下面这种方法实现:
Minilog& Minilog::GetInst() { /* if (sm_pInst == 0) { sm_pInst = new Minilog; } return *sm_pInst;*/ static Minilog theLog; return theLog; } void Minilog::ReleaseRC() { /* if (sm_pInst != 0) { delete sm_pInst; sm_pInst = 0; }*/ }
基本使用方法,如果你有一个叫MODULE的模块,要记录这个模块的日志,你可以这样做:
#define MODULE "[module]" #define X_INFO(...) LOG_INFO(MODULE __VA_ARGS__) // 以下省略
Minilog提供了很多方法,但是通常情况下用宏就可以进行日常的使用了,不建议直接使
用,如果想了解如何实现,请参阅代码。
示例
SET_LOG_PATH("."); SET_LOG_FILE("hello"); //SET_LOG_LEVEL("debug"); SET_LOG_FILE_LEVEL("DEBUG"); SET_LOG_CONSOLE_LEVEL("debug"); LOG_DEBUG("%s %d\n", "DEBUG", 207); LOG_INFO("%s %d\n", "hello", 207); #ifdef _MSC_VER Sleep(1000); #else sleep(1); #endif LOG_WARN("%s %d\n", "hello", 207); LOG_ERROR("%s %d\n", "hello", 207); LOG_FATAL("%s %d\n", "hello", 207); LOG_FLUSH();
运行结果:
其它
如果可能,所有的文件都不提供VC解决方案,如果用VC。当然你先要设置你的VC环境(运行VC安装目录下vcvarsall.bat这个文件即可),命令行编译方法:
E:\minilog>cl /c /EHsc *.cpp
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.30729.01 版
版权所有(C) Microsoft Corporation。保留所有权利。
minilog.cpp
minilogtest.cpp
test.cpp
正在生成代码...
E:\minilog>link /out:test.exe *.obj
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
E:\minilog>
当然,你用其它编译器的话,你伪装一下VC,因为VC会定义_MSC_VER这个宏,其实编译器没有,这个宏是判定是否在WINDOWS的标准,当然实际是不合理的,如果需要,请自行修改,比如用mingw g++:
E:\minilog>g++ -o test.exe *.cpp -D_MSC_VER