使用 glog 记录无法正常工作

ksh*_*ngh 3 c++ glog

当我使用时,我使用 glog 进行日志记录:

LOG(INFO) << "something";
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但是当我使用如下所示的多个日志时,它不会记录,直到程序停止。当程序停止时,它将按预期记录所有内容。

LOG(INFO) <<"111111111111111";
LOG(INFO) <<"222222222222222";
LOG(INFO) <<"333333333333333";
LOG(INFO) <<"444444444444444";
Run Code Online (Sandbox Code Playgroud)

但这里令人困惑的是,当我多次使用 LOG(WARNING) 时,它可以完美运行,即,即使程序正在运行,它也会记录所有内容,这与之前在程序停止时记录所有内容的情况不同。

LOG(WARNING) <<"111111111111111";
LOG(WARNING) <<"222222222222222";
LOG(WARNING) <<"333333333333333";
LOG(WARNING) <<"444444444444444";
Run Code Online (Sandbox Code Playgroud)

**非常感谢对此行为的任何帮助**

muX*_*t2X 6

问题相当简单。glog 默认为每个严重性使用一个日志文件,以防止两个流打开同一个文件。如果您c++通过不同的流打开同一个文件,其中一个(第一个打开文件的)将优先写入文件。另一个只能在第一个流关闭时开始写入该文件。

您要么必须为每个严重性声明不同的日志文件,要么将所有日志消息放在一个文件中,您只需编写自己的小型日志库即可。


似乎特别是 INFO 流需要使用google::FlushLogFiles(google::INFO). 要在要记录的每个信息之后执行此操作,我将定义自己一个宏来调用刷新函数,如下所示:

#define log(severity, msg) LOG(severity) << msg; google::FlushLogFiles(google::severity); 
Run Code Online (Sandbox Code Playgroud)

这确保流将被刷新并且您的所有消息都将出现在日志文件中


Pav*_*ath 6

这是因为默认情况下glog缓冲INFO日志。缓冲由FLAG_logbuflevel默认值为 0的标志控制,也就是说所有严重性 <= 该值都将被缓冲。

接受的答案工作,因为google::FlushLogFiles(min_severity)力刷新所有日志> = min_severity,但它可能不是在生产代码库来定义我们的自定义宏可行的。因此,防止INFO日志缓冲的最简单解决方案是设置FLAG_logbuflevel-1

其他答案提出了一个有趣的想法LogMessage::~LogMessage()有一个呼叫Flush(),因此作为公认的答案是不需要提出明确的红晕。这是不正确的调用Flush()在析构函数是有条件的。这是调用堆栈-

LogMessage::~LogMessage()
|__LogMessage::Flush()
   |__(LogMessage::*send_method_)() == LogMessage::SendToLog()
       |__LogDestination::LogToAllLogfiles()
          |__LogDestination::MaybeLogToLogfile()
             |__Logger::Write(should_flush = log_severity > FLAGS_logbuflevel )
Run Code Online (Sandbox Code Playgroud)

正如您在调用堆栈的最后一帧中看到的那样,Write日志目标(文件)的实际值采用一个布尔值should_flush,该布尔值取决于FLAGS_logbuflevel我之前提到的标志。

因此,默认情况下,即使Flush在 dtor 中调用了数据到磁盘的实际刷新,也不会发生LogMessage