我正在尝试进行调试(仅具有Windows)glog代码。
我无法发掘的一部分是LOG(INFO) << "something"
将字符串移动到缓冲区吗?
据我所知
LogMessageData::message_text_
,需要用日志消息填充。但是我无法确定消息是如何被推送到其中的。
答案 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的引用,您将使用<<
LOG(INFO)<<"something";
1476 ostream& LogMessage::stream() {
1477 return data_->stream_;
1478 }
这里data_->stream_
是LogStream
的对象,它是从std::ostream
派生的。