最简单跨平台的日志库

这里是我之前最常用的日志库的代码,所有操作几乎都是通过宏实现。只需要修改 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;
}

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

原文地址:https://www.cnblogs.com/sinpo828/p/10678943.html