zoukankan      html  css  js  c++  java
  • 最简单跨平台的日志库

    这里是我之前最常用的日志库的代码,所有操作几乎都是通过宏实现。只需要修改 fprintf 的参数就可以很容易的重定向的不同的文件或者终端。

    具有以下特点:

    1. 代码简单易懂,全部是宏的实现
    2. 跨平台,支持Android,Linux,macOS,Windows
    3. 易扩展,只需要简单的封装就可以日志实现重定向
    4. 用户友好,不同级别日志显示,具有不同的颜色。

    code:

    #include <stdlib.h>
    #include <stdio.h>
    
    /* stream related */
    #if defined(DEBUG)
    #define log_print(fmt, arg...)		do{ fprintf(stdout, "[%s:%04d] "fmt"
    ", __FILE__, __LINE__, ##arg); }while(0);
    #define log_debug(fmt, arg...)      {log_print("33[47;30m""Debug: "fmt"33[0m", ##arg);}
    #else
    #define log_print(fmt, arg...) 		do{ fprintf(stdout, fmt"
    ", ##arg); }while(0);
    #define log_debug(fmt, arg...)
    #endif
    #define log_warn(fmt, arg...)       {log_print("33[40;33m""Warn: "fmt"33[0m", ##arg);}
    #define log_error(fmt, arg...)      {log_print("33[40;31m""Error: "fmt"33[0m", ##arg);}
    #define log_fatal(fmt, arg...)      {log_print("33[41;37m""Fatal: "fmt"33[0m", ##arg); abort();}
    #define log_info(fmt, arg...)       {log_print("33[40;37m"fmt"33[0m", ##arg);}
    #define log_verbose(fmt, arg...)    {if(verbose) log_print("33[40;37m"fmt"33[0m", ##arg);}
    
    /* global variable */
    static int verbose = 1;
    
    //#define copy_bit(u1, u2) {(u1) = (u2);}
    //#define test_bit(u32, n) {(u32) & 1<<n;}
    //#define set_bit(u32, n) {(u32) = (u32) | 1<<(n);}
    //#define clr_bit(u32, n) {(u32) = (u32) & ~(1<<(n));}
    //#define cln_bit(u32) {(u32) &= 0;}
    
    /* macros */
    //#define ARRAY_SIZE(u) (sizeof(u)/sizeof(u[0]))
    //#define return_if_fail(cond) {if (!(cond)) return;}
    //#define return_val_if_fail(cond, val) {if (!(cond)) return (val);}
    
    /* version info */
    #define MAJOR 1
    #define MINOR 2
    #define REVISION 3
    
    #define STRINGIFY_HELPER(v) #v
    #define STRINGIFY(v) STRINGIFY_HELPER(v)
    #define VERSION_STRING() STRINGIFY(MAJOR) "." 
                             STRINGIFY(MINOR) "." 
                             STRINGIFY(REVISION)
    #define VERSION_CODE() (MAJOR << 16 + MINOR << 8 + REVISION)
    int main(int argc, char **argv)
    {
        log_info("version string: %s", VERSION_STRING());
        log_info("version code: %d", VERSION_CODE());
        log_info("info");
        log_verbose("verbose");
        log_warn("warn");
        log_error("error");
        log_debug("debug");
        log_fatal("fatal");
    
        return 0;
    }
    

    最终结果:
    在这里插入图片描述

  • 相关阅读:
    【郑轻】[1749]Forceast!
    【郑轻】[1749]Forceast!
    【郑轻】[1754]Chowhound!Chowhound!!Chowhound!!!
    【郑轻】[1754]Chowhound!Chowhound!!Chowhound!!!
    【郑轻】[1750]Bean!
    【郑轻】[1750]Bean!
    【郑轻】[1000]整数A+B
    【郑轻】[1000]整数A+B
    【杭电】[1236]排名
    【杭电】[1236]排名
  • 原文地址:https://www.cnblogs.com/sinpo828/p/10678943.html
Copyright © 2011-2022 走看看