我有以下系统架构(无法更改 - 遗留代码):一个主应用程序调用一个或多个其他应用程序,这些应用程序通过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 );
}
答案 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());
现在输出不再是字符方式了。 但我对这种行为没有很好的解释,有人知道为什么吗?