多个应用程序写入一个控制台 - 混合/混乱输出

时间:2012-01-16 09:58:58

标签: windows console

我有以下系统架构(无法更改 - 遗留代码):一个主应用程序调用一个或多个其他应用程序,这些应用程序通过IP协议进行交互。

所有应用程序都写入一个控制台窗口。不幸的是,控制台输出可能会混乱(app 1中的一个字符,app 2中的下一个字符,app 4中的下一个字符等)。 所有应用程序使用cout / cerr通过一个Logger.dll(提供静态日志记录功能)写入控制台。

有什么方法可以阻止此设置中的混合日志消息?

提前致谢。

编辑代码已添加:

void Logger::Log(const std::string & componentName, const std::string & Text, LogLevel logLevel, bool logToConsole, bool beep) 
{   
    std::ostringstream stream;

    switch (logLevel)
    {   
        case LOG_INFO:

            if (logToConsole) 
            {
                 stream << componentName << ": INFO " << Text;
                 mx_console.lock(); // this is a static boost::mutex
                 std::cout << stream.str() << std::endl;
                 std::cout.flush();
                 mx_console.unlock();
            }
            break;

       case LOG_STATUS: 

            stream << componentName << ": STATUS " << Text;
            mx_console.lock();
            std::cout << stream.str() << std::endl;
            std::cout.flush();
            mx_console.unlock();
            break;

       case LOG_WARNING:

            stream << componentName << ": WARNING " << Text;
            mx_console.lock();
            std::cout << stream.str() << std::endl;
            std::cout.flush();
            mx_console.unlock();
            break;

       default:;
     }

    if (beep)
         Beep( 500, 50 ); 
}

3 个答案:

答案 0 :(得分:0)

由于您具有单独的日志记录功能,因此您至少可以使用某种锁定(全局互斥锁等)来避免过多地散布来自不同应用程序的消息。为了使其更具可读性和更易读性,请添加一些识别信息,如进程名称或PID。将Logger.dll包装在现有的日志记录库中听起来也像是一个选项。

或者,您可以使用日志记录功能将消息转发到主应用程序,并让它来整理同步和散布。

答案 1 :(得分:0)

Syslog可能是您的解决方案,因为它旨在处理来自不同地方的日志。 Syslog是为unix开发的,但是this answer显示了windows的版本。

您可以更改记录器以记录到syslog而不是控制台。

答案 2 :(得分:0)

我现在替换了所有的

std::cout << stream.str();

语句

std::string str = stream.str();
printf(str.c_str());

现在输出不再是字符方式了。 但我对这种行为没有很好的解释,有人知道为什么吗?