封装log
C标准库提供了printf
作为日志输出函数
C++中stl提供了std::cout
作为日志输出函数
当然这两种接口使用起来都不太方便
printf函数太长 而且日志没有分级别
cout使用起来则更为繁琐
std::cout << "test" << std::endl;
封装printf
常见的封装方法是这样的:
#define log(fmt,...)\
do {\
printf(fmt, ##__VA_ARGS__);\
} while(0)
这样封装后 printf可变参数的优点被保留下来 同时也不需要那么长的函数名
Android SDK中的做法
在Android中使用JNI接口时
可以这么使用日志 Log.i(“tag”, “test”);
类似的接口还有Log.d(),Log.e()
后缀的i e d代表的是日志的级别
i是info e是error d是debug
同样的 通过几个宏定义可以实现这种效果
#define Log.i(fmt,...)\
do {\
printf("info: ");\
printf(fmt, ##__VA_ARGS__);\
printf("\n");\
} while(0)
#define Log.d(fmt,...)\
do {\
printf("debug: ");\
printf(fmt, ##__VA_ARGS__);\
printf("\n");\
} while(0)
#define Log.e(fmt,...)\
do {\
printf("error: ");\
printf(fmt, ##__VA_ARGS__);\
printf("\n");\
} while(0)
这里只是简单的举例
工程应用中还可以加上其他效果
比如 利用 LINE_ 和FILE这些宏 定位log文件位置等等
还可以根据log级别 加上输出log的颜色来区分不同级别的log