根据@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