设计一个C++;带操作员的记录器'<<'; 我设计了C++异步轻量级记录器。大致实现如下所示: ILogger log(fileName, LoggingLevel::WARN) log << "Hello" << "This is sample warn logging"; ILogger日志(文件名,日志级别::警告) log
您可以为每个日志操作创建一个实例,而不是只有一个logger对象实例。然后在其析构函数中“刷新”队列输出设计一个C++;带操作员的记录器'<<'; 我设计了C++异步轻量级记录器。大致实现如下所示: ILogger log(fileName, LoggingLevel::WARN) log << "Hello" << "This is sample warn logging"; ILogger日志(文件名,日志级别::警告) log,c++,logging,asynchronous,mfc,C++,Logging,Asynchronous,Mfc,您可以为每个日志操作创建一个实例,而不是只有一个logger对象实例。然后在其析构函数中“刷新”队列输出 应该写入刷新输出的文件流(或队列,或任何您想要的)可以是一个静态成员,初始化一次,并由每个实例使用。为什么不让日志记录器接受std::endl作为标记来指示应该写入日志行: log << "Hello" << "This is sample warn logging" << std::endl; log您可以创建一个助手朋友类 class LogStre
应该写入刷新输出的文件流(或队列,或任何您想要的)可以是一个静态成员,初始化一次,并由每个实例使用。为什么不让日志记录器接受
std::endl
作为标记来指示应该写入日志行:
log << "Hello" << "This is sample warn logging" << std::endl;
log您可以创建一个助手朋友类
class LogStream {
ILogger& log_;
std::ostringstream logS_;
public:
LogStream(ILogger& log) : log_(log) {
}
~LogStream() {
log_.queue.add(logS_.str());
}
template<typename T>
LogStream& operator<<(const T& val) {
logS_ << val;
return *this;
}
};
那么日志记录语句
log.getStream() << "Hello" << "This is sample warn logging";
log.getStream()可能与感谢重复。但我不想这么做。如果用户不小心漏掉了endl怎么办?他认为消息正在被记录,而消息不会被记录t@MohanKumar用户忘记结束行或刷新流的问题仍然存在于普通的std::cout
。是的,有些案例在这里结束,有人想知道为什么他们没有得到输出。你能更详细地解释一下吗。我明白,但要将此作为可接受的答案,不需要更多的澄清
LogStream ILogger::getStream() {
return LogStream(*this);
}
log.getStream() << "Hello" << "This is sample warn logging";