void LogWriter::WriteLog(LPCTSTR log, const char ending, LPTSTR args, ...)
{
TCHAR str[128] = {0};
int len = (sizeof(log)/sizeof(TCHAR));
len += sizeof(ending)/sizeof(char); //might switch ending to TCHAR..might have to
_stprintf_s(str, len+4, "%s()%c", log, ending);
myOutput.push(str);
//used to output to console for testing
//if (args != NULL)
//{
// va_list argptr;
// va_start(argptr, args);
// vfprintf(stdout, args, argptr);
// va_end(argptr);
//}
}
所以这是一种很酷的方式将我的日志打印到控制台..但现在我希望能够选择我放置日志的位置。我决定只将wcout重定向到文件或控制台。当我输出到控制台时,这样做非常容易,因为我只有
void LogWriter::WriteLog(const char* log, const char ending, char* args, ...)
{
std::wcout << log << "(";
if (args != NULL)
{
va_list argptr;
va_start(argptr, args);
vfprintf(stdout, args, argptr);
va_end(argptr);
}
std::wcout << ")" << ending << std::endl;
}
并且生活很美好...当它是单线程程序并且所有日志记录都进入控制台时。所以我想我会使用队列在我的日志中临时存储行。在一个单独的线程中,我清空队列并睡眠500毫秒。这很好用(我还没有对它进行过一些测试,但是对于速度/性能而言)但是对于sprintf函数,它在输出中给我带来了胡言乱语。如果我一起摆脱sprintf只是将日志推送到我的队列,它会正确输出字符串。引导我说我为sprintf做错了,但我也需要/希望变量参数也进入那里......嗯这可能意味着改变某事。我有一些可能会影响的宏..
#define WRITE_START LogWriter::WriteLog(__FUNCTION__, '+')
#define WRITE_STARTF(_smsg, ...) LogWriter::WriteLog(__FUNCTION__, '+', _smsg, __VA_ARGS__)
//example of usage
void test1(LPCTSTR lpclDevClass, LPCTSTR lpclDevName)
{
WRITE_STARTF(_T("*%s* %s"), lpclDevClass, lpclDevName);
}
void test2()
{
WRITE_START;
}
关于我应该怎么做的任何想法?谢谢