根據@inolasco的回答,靜態變量不是線程安全的。改用局部變量。
void getFormattedTime(char * const p, int sz) {
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(p, sz, "%Y-%m-%d %H:%M:%S", timeinfo);
}
int mylog(const char* fmt, ...) {
// TODO: log to file also.
// TODO: create a new log file daily
va_list argptr;
va_start(argptr, fmt);
vfprintf(stderr, fmt, argptr);//log to stderr
va_end(argptr);
}
#ifdef _WIN32
#define __SHORT_FILE__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
#else
#define __SHORT_FILE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#endif
#define ___LOG___(fmt,level,path, ...) do{\
/* using local var and using a long name to avoid conflict*/ \
char LAgGV3nzJsTholGvGL2eTNXmhsqYe___xxooxxoo___[24];\
getFormattedTime(LAgGV3nzJsTholGvGL2eTNXmhsqYe___xxooxxoo___,\
sizeof(LAgGV3nzJsTholGvGL2eTNXmhsqYe___xxooxxoo___));\
mylog("%s [%s] [%s:%d] [%s] " fmt "\n", \
LAgGV3nzJsTholGvGL2eTNXmhsqYe___xxooxxoo___, \
level,\
path,\
__LINE__, \
__func__, \
## __VA_ARGS__);\
}while(0)
#define trace(fmt, ...) ___LOG___(fmt, "TRACE",__SHORT_FILE__, ## __VA_ARGS__)
#define debug(fmt, ...) ___LOG___(fmt, "DEBUG",__SHORT_FILE__, ## __VA_ARGS__)
#define info(fmt, ...) ___LOG___(fmt, "INFO",__SHORT_FILE__, ## __VA_ARGS__)
#define warn(fmt, ...) ___LOG___(fmt, "WARN",__SHORT_FILE__, ## __VA_ARGS__)
#define error(fmt, ...) ___LOG___(fmt, "ERROR",__SHORT_FILE__, ## __VA_ARGS__)
#define tracel(fmt, ...) ___LOG___(fmt, "TRACE", __FILE__, ## __VA_ARGS__)
#define debugl(fmt, ...) ___LOG___(fmt, "DEBUG", __FILE__, ## __VA_ARGS__)
#define infol(fmt, ...) ___LOG___(fmt, "INFO", __FILE__, ## __VA_ARGS__)
#define warnl(fmt, ...) ___LOG___(fmt, "WARN", __FILE__, ## __VA_ARGS__)
#define errorl(fmt, ...) ___LOG___(fmt, "ERROR", __FILE__, ## __VA_ARGS__)
稱他們是這樣的:
info("%s", "a log");
infol("%s", "a log");
產品:
2017-09-06 15:55:42 [INFO] [main.c:25] [main] a log
2017-09-06 15:58:08 [INFO] [d:\main.c:25] [main] a log
@Jonathan萊弗勒,我面臨的,因爲很長一段時間,這些調整問題,有沒有參考頁至REF,並採取照顧自己? – Thangaraj
你的意思是你的問題中的佈局?輸入評論時,有一個幫助超鏈接;當輸入問題或答案時,會有一個橙色問號提供打字區域上方的幫助。縮進4個空格將以下代碼作爲代碼處理;避免製表符。項目符號列表具有以星號或短劃線('*'或'-')開頭的行;你可以嵌套它們(子項目縮進2個或更多的空格),並且你可以有與它們相關的代碼(前綴爲8個空格,而不是4個,但是對於第一級項目符號)。編號列表有從'1'開始的行(這個點很重要)。等等 –
@Jonathan Leffler,謝謝 – Thangaraj