logging with glog is not working properly
当我使用:
时,我正在使用glog进行日志记录
1 | LOG(INFO) <<"something"; |
它按预期工作,但是当我使用如下所示的多个日志时,直到程序停止,它才会记录日志。当programm停止时,它将按预期记录所有内容。
1 2 3 4 | LOG(INFO) <<"111111111111111"; LOG(INFO) <<"222222222222222"; LOG(INFO) <<"333333333333333"; LOG(INFO) <<"444444444444444"; |
但是这里令人困惑的是,当我多次使用LOG(WARNING)时,它可以完美地工作,即即使程序正在运行,它也会记录所有内容,而以前的情况是在程序停止时记录所有内容。
1 2 3 4 | LOG(WARNING) <<"111111111111111"; LOG(WARNING) <<"222222222222222"; LOG(WARNING) <<"333333333333333"; LOG(WARNING) <<"444444444444444"; |
**对此行为的任何帮助将不胜感激**
这是因为默认情况下
可接受的答案是可行的,因为
另一个答案提出了一个有趣的想法,即
1 2 3 4 5 6 | LogMessage::~LogMessage() |__LogMessage::Flush() |__(LogMessage::*send_method_)() == LogMessage::SendToLog() |__LogDestination::LogToAllLogfiles() |__LogDestination::MaybeLogToLogfile() |__Logger::Write(should_flush = log_severity > FLAGS_logbuflevel ) |
如在调用堆栈的最后一帧中所见,
到日志目标(文件)的实际
因此,默认情况下,即使
的dtor中有一个
问题很简单。默认情况下,glog为每个严重性使用一个日志文件,以防止两个流打开同一文件。如果通过不同的流在
您必须为每种严重性声明不同的日志文件,或者将所有日志消息都存储在一个文件中,您只需编写自己的小日志库即可。
似乎特别是需要使用
1 | #define log(severity, msg) LOG(severity) << msg; google::FlushLogFiles(google::severity); |
这确保流将被刷新,并且您的所有消息将出现在日志文件中
尽管以上答案已被接受并且可能有助于解决问题,但我不确定这是否是解决问题的正确方法,甚至是正确的解释。
如果检查glog的代码,则会发现:
1 | #define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream() |
因此在最初的问题中,LOG(INFO)将被定义为类似于
1 | #define COMPACT_GOOGLE_LOG_INFO google::LogMessage(__FILE__, __LINE__, google::GLOG_INFO).stream() |
将创建一个临时流对象,并将日志记录内容写入该流对象。之后,将调用
也就是说,对于每个