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

How does glog LOG(INFO) << "something" work?

我正在尝试源代码调试(只有 windows)glog 代码。我无法挖掘的一部分是

LOG(INFO) << "something" 

将字符串移入缓冲区?

据我所知,

LogMessageData::message_text_

需要用日志消息填充。但是我找不到消息是如何被推送到其中的。

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

所以,

LOG(INFO) << "something"

变成像

这样的代码
std::cout << "something"

请注意,在上面的示例中,std::cout 用于详细说明 hood.In 您的源代码下的内容,可能有不同的代码而不是 std::cout

剩下的就是运算符<<的重载了。在记录器和输出流中用作插入运算符。在内部,此运算符已过载,将给定数据插入记录器或任何其他输出流等;

基本上 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

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

将字符串重定向到该引用

LOG(INFO)<<"something";

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

这里data_->stream_LogStream的一个对象,它派生自std::ostream