在android中c c++代码中添加自定义的log
来源:互联网 发布:8101e网卡驱动 mac 编辑:程序博客网 时间:2024/05/18 01:41
以前写过一篇在android中添加log的文章,写那篇文章时是在调webkit的js代码时遇到用系统的LOGD等函数无法打印出log信息,于是自己写了个log函数,来打印js信息,
这次写的log可以实现不同级别的log打印不同的颜色,可以定位到log信息所在的函数 和所在的行数,系统的LOGD等函数需要自己定义个TAG来确定是那个模块的log,我将其优化了一下,不用自己定义TAG,直接以文件名作为log的模块名,这样在看不同错误时察看log就很方便了,系统的所有log都是白颜色的,如果是错误的log,需要细细的找,我将错误的log信息设置为红颜色,这样看到红颜色的log就表示代码中有错误发生,很方便,前一篇我写的是java中的log,都是遵循这个规律。
下面是log的实现:
首先定义log的宏。
#define YVERBOSE 2 #define YDEBUG 3 #define YINFO 4 #define YWARN 5 #define YERROR 6
#define YULOGV(fmt, ...) DLOG(YVERBOSE, "%s %s (line: %d) " fmt"\033[0m ", __FILE__,__FUNCTION__,__LINE__, ##__VA_ARGS__) #define YULOGD(fmt, ...) DLOG(YDEBUG, "%s %s (line: %d) " fmt"\033[0m ", __FILE__,__FUNCTION__,__LINE__, ##__VA_ARGS__) #define YULOGI(fmt, ...) DLOG(YINFO, "%s %s (line: %d) " fmt"\033[0m ", __FILE__,__FUNCTION__,__LINE__, ##__VA_ARGS__) #define YULOGW(fmt, ...) DLOG(YWARN, "%s %s (line: %d) " fmt"\033[0m ", __FILE__,__FUNCTION__,__LINE__, ##__VA_ARGS__) #define YULOGE(fmt, ...) DLOG(YERROR, "%s %s (line: %d) " fmt"\033[0m ", __FILE__,__FUNCTION__,__LINE__, ##__VA_ARGS__)
YVERBOSE
YDEBUG
YINFO
YWARN
YERROR
这几个宏的值是系统固定的,这样在打印log信息时不同的级别的log在一行的最开始会打印这个log级别的标志,如YDEBUG这个宏在打印log信息时,一行的最开始是用
D/来表示的。
DLOG函数的实现:
int DLOG(int prio, const char *fmt, ...){ char *colorv = "\033[0;37m"; char *colord = "\033[0;34m"; char *colori = "\033[0;32m"; char *colorw = "\033[0;33m"; char *colore = "\033[0;31m"; int len = strlen(colord); va_list ap; char buf[1024] = {0}; char tmp[1024] = {0}; int i = 0; int j = 0; int k = 0; int p = 0; int d = 0; char *fp =fmt; va_start(ap,fp); vsnprintf(buf, 1024, fmt, ap); va_end(ap); for (i = 0; i < 1024; i++) { //去掉换行符\n if(buf[i] == '\n') { buf[i] = ' '; } } p = i; for(i =0; i<p; i++) {//确定文件名长度 if(buf[i] == ' ') { d = i; break; } } for (i = d ; i >=0; i--) { // if(buf[i] != '/' || buf[i] != ' ') {//确定最后文件名长度 k++; }else { break; } }//我在打印文件名时,打印的是文件名的绝对路径,不只是文件名,包括了文件所在的路径,所以需要两次确定文件名长度。 switch (prio) {//设置不同级别的log的颜色值 case 2: strncpy(tmp,colorv,len); break; case 3: strncpy(tmp,colord,len); break; case 4: strncpy(tmp,colori,len); break; case 5: strncpy(tmp,colorw,len); break; case 6: strncpy(tmp,colore,len); break; default: break; } for (i = d - k + 1 ,j = len; i <= d; i++,j++) { //获取文件名,将文件名作为tag使用, tmp[j] = buf[i]; } tmp[j] = '\0'; return __android_log_write(prio, tmp, &buf[d+1]); }
可以将上面的宏加到系统的cutils/log.h文件里,将函数的实现放到liblog/logd_write.c 文件里,这样就能当系统的log使用了,在所有的c c++代码中直接include<cutils/log.h>就能使用自己定义的log了。
打印的log截图:
- 在android中c c++代码中添加自定义的log
- 在android c代码中加log
- 在Android的c/c++代码中使用LOG
- 在Android的c/c++代码中使用LOG
- 在Android的c/c++代码中使用LOG
- 在Android的c/c++代码中使用LOG
- 在Android的c/c++代码中使用LOG
- Android NDK :在 C语言代码中输出Log
- Android NDK :在 C语言代码中输出Log
- Android环境在C代码中使用logcat获取log
- 在android的java代码中自定义log
- 在C语言代码中输出Log
- 在C代码中输出LOG
- Android JNI 在C中调用Java(包括自定义的Java方法和Log)
- 在Android的源码中添加LOG
- 在Android的源码中添加LOG
- 如何在Android jni 的c/c++中打Log
- 在Android Framework层 C/C++代码中添加日志
- 产品经理必读10文章
- Lesson07:HTML5 内联 SVG
- C中的位域
- netfilter1
- Linux 常用命令
- 在android中c c++代码中添加自定义的log
- 在EditText中插入表情图片
- linux内核input子系统解析
- 1179. Extrusion
- MyEclipse下的Debug调试
- VB.net强制结束指定进程
- u-boot一些关键命令的实现详解
- linux驱动子系统之输入子系统(5)
- 利用行SCN实现表变化跟踪