迷你日志类Minilog

简介

日志,在一般系统里是非常非常重要的,它不仅跟踪到程序的执行,同时也是对系统进行各方面分析的基础。其重要性在这里不再一一说明,有兴趣可自行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这是写法,但是事实上,当程序退出后,如果没有显式释放,是不会刷日志的,于是采用下面这种方法实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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;
    }*/
}
1
  基本使用方法,如果你有一个叫MODULE的模块,要记录这个模块的日志,你可以这样做:
1
2
3
#define MODULE "[module]"
#define X_INFO(...) LOG_INFO(MODULE __VA_ARGS__)
// 以下省略
1
Minilog提供了很多方法,但是通常情况下用宏就可以进行日常的使用了,不建议直接使
1
用,如果想了解如何实现,请参阅代码。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    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();

运行结果:

minlog.jpg

其它

如果可能,所有的文件都不提供VC解决方案,如果用VC。当然你先要设置你的VC环境(运行VC安装目录下vcvarsall.bat这个文件即可),命令行编译方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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++:

1
E:\minilog>g++ -o test.exe *.cpp -D_MSC_VER