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;
}
关于我应该如何做到这一点的任何想法?谢谢