改進(jìn)log4c的時(shí)間戳結(jié)構(gòu):
log4c里對(duì)于事件時(shí)間戳的定義是這樣的:
1 #ifndef _WIN32
2 struct timeval evt_timestamp;
3 #else
4 FILETIME evt_timestamp;
5 #endif
這個(gè)不用說(shuō)是很惡了,存的是各個(gè)平臺(tái)的api得到的原始時(shí)間,格式化的時(shí)候還要按不同平臺(tái)寫不同的格式化代碼,而我們輸出日志的時(shí)候通常是按年月日時(shí)分秒的結(jié)構(gòu)來(lái)輸出,存一個(gè)通用的結(jié)構(gòu)更好,time.h里就有一個(gè)比較好的結(jié)構(gòu)struct tm, 可以使用gmtime或localtime來(lái)得到。
1 struct tm {
2 int tm_sec; /* seconds after the minute - [0,59] */
3 int tm_min; /* minutes after the hour - [0,59] */
4 int tm_hour; /* hours since midnight - [0,23] */
5 int tm_mday; /* day of the month - [1,31] */
6 int tm_mon; /* months since January - [0,11] */
7 int tm_year; /* years since 1900 */
8 int tm_wday; /* days since Sunday - [0,6] */
9 int tm_yday; /* days since January 1 - [0,365] */
10 int tm_isdst; /* daylight savings time flag */
11 };
時(shí)間精確到秒,而且可惜的是,這些函數(shù)的跨平臺(tái)性不夠好,windows ce上就沒(méi)有,所以定義一個(gè)通用的時(shí)間結(jié)構(gòu)如下:
1 typedef struct
2 {
3 int tm_milli; /* millisecond - [0,999] */
4 int tm_sec; /* seconds after the minute - [0,59] */
5 int tm_min; /* minutes after the hour - [0,59] */
6 int tm_hour; /* hours since midnight - [0,23] */
7 int tm_mday; /* day of the month - [1,31] */
8 int tm_mon; /* months since January - [0,11] */
9 int tm_year; /* years since 1900 */
10 int tm_wday; /* days since Sunday - [0,6] */
11 int tm_yday; /* days since January 1 - [0,365] */
12 } log4c_common_time_t;
跟struct tm相比,增加了一個(gè)
tm_milli,因?yàn)橐蕾嚻脚_(tái)相關(guān)api的話,可以取到更精確的時(shí)間。這樣輸出的時(shí)候把它的fields格式化就可以了。
接下來(lái)就是取當(dāng)前時(shí)間戳的函數(shù)來(lái),跟平臺(tái)相關(guān),支持struct tm,localtime的版本如下,精度為秒:
1 void xp_gettimeofday(log4c_common_time_t* p,void* reserve)
2 {
3 struct tm tm;
4 time_t t = time(0);
5 tm = *localtime(&t);
6
7 p->tm_hour = tm.tm_hour;
8 p->tm_isdst = tm.tm_isdst;
9 p->tm_mday = tm.tm_mday;
10 p->tm_milli = 0;
11 p->tm_min = tm.tm_min;
12 p->tm_mon = tm.tm_mon;
13 p->tm_sec = tm.tm_sec;
14 p->tm_wday = tm.tm_wday;
15 p->tm_yday = tm.tm_yday;
16 p->tm_year = tm.tm_year + 1900;
17 }
Windows CE使用的版本如下,精度為毫秒,當(dāng)然windows也可以使用:
1 void xp_gettimeofday(log4c_common_time_t* p)
2 {
3 SYSTEMTIME time;
4 GetSystemTime(&time);
5 p->tm_milli = time.wMilliseconds;
6 p->tm_sec = time.wSecond;
7 p->tm_min = time.wMinute;
8 p->tm_hour = time.wHour;
9 p->tm_mday = time.wDay;
10 p->tm_mon = time.wMonth;
11 p->tm_wday = time.wDayOfWeek;
12 p->tm_year = time.wYear;
13 }