如果您查看 protobuf 代码,您会发现它使用自己的日志记录系统 - 基于宏。默认情况下,所有这些消息都会发送到stderr,但您可以使用SetLogHandler() 在程序中捕获它们:
typedef void LogHandler(LogLevel level, const char* filename, int line,
const std::string& message);
可能的解决方案是制作你自己的errno-like 机制(对不起C++11-ishness):
typedef LogMessage std::tuple<LogLevel, std::string, int, std::string>; // C++11
typedef LogStack std::list<LogMessage>;
namespace {
LogStack stack;
bool my_errno;
} // namespace
void MyLogHandler(LogLevel level, const char* filename, int line,
const std::string& message) {
stack.push_back({level, filename, line, message}); // C++11.
my_errno = true;
}
protobuf::SetLogHandler(MyLogHandler);
bool GetError(LogStack* my_stack) {
if (my_errno && my_stack) {
// Dump collected logs.
my_stack->assign(stack.begin(), stack.end());
}
stack.clear();
bool old_errno = my_errno;
my_errno = false;
return old_errno;
}
并在您的代码中使用它:
...
else {
std::cerr<< "error parsing protobuf" << std::endl;
LogStack my_stack;
if (GetError(&my_stack) {
// Handle your errors here.
}
}
我的示例代码的主要缺点 - 它不适用于多线程。但这可以自己解决。