我有以下系统架构(不能更改 - 遗留代码):一个主应用程序调用一个或多个其他应用程序,这些应用程序通过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);
}
该Logger.dll可以更改吗? – stefaanv 2012-01-16 10:06:13
是的,这是我们项目的一部分。它被引入以避免每个应用程序中的代码重复。 – Simon 2012-01-16 10:08:39
您的日志输出功能是否是多线程安全的?如果文本在输出控制台中混合,那么它看起来不是。您可以使用互斥锁来保护您的日志功能。 – boto 2012-01-16 10:18:12