glog LOG(INFO)<<“ something”如何工作?

时间:2019-12-02 07:47:51

标签: c++ glog

我正在尝试进行调试(仅具有Windows)glog代码。

我无法发掘的一部分是

LOG(INFO) << "something" 

将字符串移动到缓冲区吗?

据我所知

LogMessageData::message_text_

,需要用日志消息填充。但是我无法确定消息是如何被推送到其中的。

2 个答案:

答案 0 :(得分:3)

如果您查看LOG(INFO)宏,它将在预处理阶段扩展为类似于std :: cout的c ++代码(在编译代码之前)。您将必须设置一个编译器标志来生成宏扩展文件,才能看到替换代码行。 (这取决于您使用的编译器。只需在Internet上搜索即可)

所以

LOG(INFO) << "something"

成为一些类似的代码

std::cout << "something"

请注意,在上面的示例中std :: cout用于详细说明底层情况。在代码不同的情况下,可能有不同的对象而不是std :: cout

Rest取决于运算符<<的重载。在记录器和输出流中用作插入运算符。在内部,此操作符过载,将给定数据插入记录器或任何其他输出流等;

答案 1 :(得分:2)

基本上,LOG(INFO)返回了对std::ostream的引用;您正在向其写入字符串的位置。快速浏览一下glog代码,了解它是如何实现的。

src/windows/glog/logging.h中-您会看到LOG()是一个宏,接受严重性作为参数。这只是将INFO附加到COMPACT_GOOGLE_LOG_并调用其中的stream() ...

#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream() 

同一文件的定义为COMPACT_GOOGLE_LOG_INFO,它表明这只是函数调用-  google::LogMessage().stream();

398 #if GOOGLE_STRIP_LOG == 0
399 #define COMPACT_GOOGLE_LOG_INFO google::LogMessage( \                                                                                                                                                            400       __FILE__, __LINE__)
401 #define LOG_TO_STRING_INFO(message) google::LogMessage( \
402       __FILE__, __LINE__, google::GLOG_INFO, message)
403 #else
404 #define COMPACT_GOOGLE_LOG_INFO google::NullStream()
405 #define LOG_TO_STRING_INFO(message) google::NullStream()
406 #endif

现在,查看src/logging.cc文件中LogMessage的流功能。 这将返回对ostream的引用,您将使用<<

将字符串重定向到该ostream

LOG(INFO)<<"something";

1476 ostream& LogMessage::stream() {                                                                                                                                                                                                     
1477   return data_->stream_;
1478 }

这里data_->stream_LogStream的对象,它是从std::ostream派生的。

相关问题