1
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;
}

关于我应该如何做到这一点的任何想法?谢谢

4

0 回答 0