• 迷你日志类Minilog


    这个也发表在我另一个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();

    运行结果:

    minilog

    其它

            如果可能,所有的文件都不提供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
  • 相关阅读:
    Linux下命令设置别名--alias(同实用于mac)
    mac 下配置连接Linux服务器方法,上传下载文件操作
    Jdbc和工具类
    MySQL和数据库
    validate和bootstrap学习
    jQuery学习
    JavaScripe学习
    CSS学习
    HTML学习
    Metail Design入门(一)
  • 原文地址:https://www.cnblogs.com/imlgc/p/2356630.html
Copyright © 2020-2023  润新知