【发布时间】:2013-01-27 15:15:03
【问题描述】:
我们有一个基于带有自定义流缓冲区的 std::ostream 的日志实现。我们通过 Schwarz 计数器实现我们应用程序的日志类实例。
为了避免将我们的低级类耦合到我们的日志实现,我们可以传递对 std::ostream 的引用。通过这种方式,我们的低级类可以记录到 std::cout、std::cerr 或通过 Schwarz 计数器创建的实例。
我有一个问题。日志实现通过流运算符的重载设置其严重性:
// Overload the << operator to set the log message severity
inline CLogStream& operator << (CLogStream& myLogStream, eMsgType::type msgTypeCurrent)
{
myLogStream.SetMsgTypeCurrent(msgTypeCurrent);
return ( myLogStream ) ;
}
这允许我们像这样使用记录器:
CLog::Main << CLog::MSG_FATAL << "Fatal error" << std::endl;
我想创建一个对我们应用程序的日志实例的引用,该日志被锁定到特定的严重性。这样,我可以将两个 std::ostream 引用传递给我们的实用程序类。其中一个用于正常报告,另一个用于错误报告。这些可以设置为 std::cout 和 std::cerr,或者设置为引用我们的日志对象实例的某种对象。
不幸的是,据我所知,std::ostream 运算符
有什么想法吗?
【问题讨论】:
-
如果
SetMsgTypeCurrent不是virtual(即CLogStream不是为继承而设计的),那就很难了。 -
@Jon:我可以更改 SetMsgTypeCurrent 的定义,如果有帮助的话可以将其设为虚拟。但是我需要通过 std::ostream 访问该类,所以我看不到会给我什么选项。我知道的唯一虚函数在 std::streambuf 中,它们似乎都没有用于此目的。
-
不是答案,但是:我也可以看到这种设计的其他问题。特别是,它不是线程安全的:另一个线程可能会干扰
<< CLog::MSG_FATAL和<< "Fatal error"。完全改变设计是一种选择吗? -
@jogojapan:在设计类时,线程被排除在应用程序设计之外。有人建议我们放宽这一限制,因此几乎可以肯定设计更改正在酝酿之中。这种设计的另一个问题是,即使日志级别没有得到输出,也会生成日志消息。我认为我们可以通过某种包装器一起解决这两个问题,但这需要几个月的时间和设计审查。
标签: c++ dependencies