2012-01-16 50 views
0

我有以下系统架构(不能更改 - 遗留代码):一个主应用程序调用一个或多个其他应用程序,这些应用程序通过IP协议进行交互。多个应用程序写入一个控制台 - 混合/杂乱输出

所有应用程序都写入一个控制台窗口。不幸的是,控制台输出可能会搞砸(应用程序1的一个字符,应用程序2的下一个字符,应用程序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); 
} 
+0

该Logger.dll可以更改吗? – stefaanv 2012-01-16 10:06:13

+0

是的,这是我们项目的一部分。它被引入以避免每个应用程序中的代码重复。 – Simon 2012-01-16 10:08:39

+0

您的日志输出功能是否是多线程安全的?如果文本在输出控制台中混合,那么它看起来不是。您可以使用互斥锁来保护您的日志功能。 – boto 2012-01-16 10:18:12

回答

0

我现在全部换成了

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

陈述与

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

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

+0

更有趣:printf在没有互斥锁的情况下工作就好了 – Simon 2012-01-16 13:48:39

0

因为你必须在最低限度使用单独的日志记录功能,可以某种锁定(全局互斥锁等),以避免穿插来自不同应用程序的消息太多了。为了使其更具可读性和可读性,请添加一些标识信息,如进程名称或PID。将Logger.dll包裹在现有的日志记录库中听起来也是一种选择。

或者,您可以将日志功能转发给您的主应用程序,然后让它来排序同步和散布。

0

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

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

+0

我试图独立于任何其他工具/库,如果可能的话 – Simon 2012-01-16 11:52:54