这里是我之前最常用的日志库的代码,所有操作几乎都是通过宏实现。只需要修改 fprintf 的参数就可以很容易的重定向的不同的文件或者终端。
具有以下特点:
- 代码简单易懂,全部是宏的实现
- 跨平台,支持Android,Linux,macOS,Windows
- 易扩展,只需要简单的封装就可以日志实现重定向
- 用户友好,不同级别日志显示,具有不同的颜色。
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;
}
最终结果: