近来在Linux下开发中用到c/c++和nodejs混合编程,看到adb logcat -v threadtime 打出来的Log那么整齐规范,非常想把c/c++代码的log规范成这种效果一下,
需要这样做有两个原因:
1.有的人没有用到adb, 或者log不输出到控制台,没法用adb logcat -v threadtime。
2. adb logcat的时间戳是后加的,不是调用打印log当时的时间。我看到过logcat时间戳前后颠倒,或者间隔明显不对的情况;系统io占用较高情况下会出现这种问题。
于是尝试自己printf加上时间戳,也就是这句话了:
#define MY_DEBUG(format, ...) printf("%s %d %d D %s: %s "#format "\n", timeString(), (int)getpid(), (int)syscall(SYS_gettid), TAG, __FUNCTION__, ##__VA_ARGS__)
宏定义可以用...表示剩余其他参数,在这个基础上加上时间戳、pid、tid、TAG、functionname.
时间戳这个事确实没有现成的,我通过timeString()函数自己根据clocktime算出来月、日、时、分、秒、毫秒,并格式化为固定宽度2位、3位。
获取pid没问题,但tid如果用gettid()经常报error: ‘gettid’ was not declared in this scope. 查了一下是个常见的glibc问题,索性用syscall(SYS_gettid)绕过。
上完整实验代码:
#include
#include
#include
#include
#define TAG "MY_TEST"
#define MY_DEBUG(format, ...) printf("%s %d %d D %s : %s "#format "\n", timeString(), (int)getpid(), (int)syscall(SYS_gettid), TAG, __FUNCTION__, ##__VA_ARGS__)
// #define LOG_D(format, ...) MY_DEBUG( D #format, ##__VA_ARGS__)
char * timeString() {
struct timespec ts;
clock_gettime( CLOCK_REALTIME, &ts);
struct tm * timeinfo = localtime(&ts.tv_sec);
static char timeStr[20];
sprintf(timeStr, "%.2d-%.2d %.2d:%.2d:%.2d.%.3ld", timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, ts.tv_nsec / 1000000);
return timeStr;
}
void testWait(int index, int second, int nanoSecond) {
MY_DEBUG(wait time is: %ds %dns index: %d, second, nanoSecond, index);
return;
}
int main(int argc, char** argv) {
MY_DEBUG(test ok\n);
for (int i = 0; i<4;i++) {
testWait(i, 3, 2000020);
}
return 0;
}
adb logcat -v threadtime 输出结果:
01-05 03:22:51.076 22982 22982 I CONSOLE : testWait wait time is: 3s 2000020ns
编译执行我的log后,g++ ./testWait.cpp -o run -lrt 输出结果:
$:~/test_code/lab$ g++ ./testWait.cpp -o run -lrt
$:~/test_code/lab$ ./run
12-26 10:45:32.360 7286 7286 D MY_TEST : main test ok
12-26 10:45:32.360 7286 7286 D MY_TEST : testWait wait time is: 3s 2000020ns index: 0
12-26 10:45:32.360 7286 7286 D MY_TEST : testWait wait time is: 3s 2000020ns index: 1
12-26 10:45:32.360 7286 7286 D MY_TEST : testWait wait time is: 3s 2000020ns index: 2
12-26 10:45:32.360 7286 7286 D MY_TEST : testWait wait time is: 3s 2000020ns index: 3
到这里已经和logcat日志一样了,还剩下一个引号问题我一直没有解决,细心的同学可能已经看到了,调用打印log时都没有加引号
MY_DEBUG(wait time is: %ds %dns index: %d, second, nanoSecond, index);
因为加了引号后,输出的testWait wait time……前后会各加一个“,看着不好看。不知道有啥办法可以让调用时的引号不打印出来。
12-26 10:44:12.869 4960 4960 D MY_TEST : testWait "wait time is: 3s 2000020ns index: 0"