zoukankan      html  css  js  c++  java
  • 迷你日志类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
  • 相关阅读:
    第一节:SpringMVC概述
    SpringMVC【目录】
    Windows 系统快速查看文件MD5
    (error) ERR wrong number of arguments for 'hmset' command
    hive使用遇到的问题 cannot recognize input
    Overleaf支持的部分中文字体预览
    Understanding and Improving Fast Adversarial Training
    Django2实战示例 第十三章 上线
    Django2实战示例 第十二章 创建API
    Django2实战示例 第十一章 渲染和缓存课程内容
  • 原文地址:https://www.cnblogs.com/imlgc/p/2356630.html
Copyright © 2011-2022 走看看