GetLastError 自定义属性

问题描述 投票:0回答:1

我想在每个日志输出中包含

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)

boost boost-log
1个回答
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";
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.