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
。
我正在尝试源代码调试(只有 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
。