我想在每个日志输出中包含
GetLastError
,但是当 boost::log 在查询属性值之前调用另一个 Windows API 时,该值会被覆盖。有人知道解决这个问题的好方法吗?
class get_last_error_attribute_impl : public boost::log::attribute::impl {
public:
boost::log::attribute_value get_value() {
return boost::log::attributes::make_attribute_value(GetLastError());
}
};
class get_last_error_attribute : public boost::log::attribute {
public:
get_last_error_attribute() :
boost::log::attribute(new get_last_error_attribute_impl()) {
}
};
void init_logging() {
auto core = boost::log::core::get();
core->add_global_attribute("GetLastError", get_last_error_attribute());
auto sink = boost::make_shared<
boost::log::sinks::synchronous_sink<boost::log::sinks::debug_output_backend>>();
sink->set_formatter(
boost::log::expressions::stream
<< boost::log::trivial::severity
<< ": " << boost::log::expressions::smessage
<< " (" << boost::log::expressions::attr<DWORD>("GetLastError") << ")"
);
core->add_sink(sink);
}
void main() {
init_logging();
if (!DeleteFileA("c:\\foo.bar")) {
BOOST_LOG_TRIVIAL(warning) << "delete failed";
}
}
日志输出:
警告:删除失败(0)
我通过使用断言来捕获
GetLastError
来解决这个问题
#define BOOST_ENABLE_ASSERT_HANDLER 1
#include <boost/assert.hpp>
namespace boost {
void assertion_failed([[maybe_unused]] char const* expr, [[maybe_unused]] char const* function, char const* file, long line) {
auto err = GetLastError();
BOOST_LOG_TRIVIAL(warning) << file << "(" << line << ") [" << err << "] assert failed";
SetLastError(err);
}
}
void init_logging() {
auto sink = boost::make_shared<boost::log::sinks::synchronous_sink<boost::log::sinks::debug_output_backend>>();
boost::log::core::get()->add_sink(sink);
}
void main() {
init_logging();
BOOL rc;
BOOST_VERIFY(rc = DeleteFileA("c:\\fjfjfjfj.hhh"));
if (!rc) {
BOOST_LOG_TRIVIAL(warning) << "delete failed";
}
}