我已經創建了一個基於Boost Log的記錄器機制。Boost日誌回調
我的代碼是基於如此example中所示的普通記錄器。
我想知道,每當發生致命錯誤如何自動調用系統退出
exit(1)
(或任何其他自定義的回調函數)。
歡迎任何幫助!
UPDATE:
的解決方案是extend the backend sink通過重載consume()
方法。水槽檢查瑣碎記錄的嚴重級別的
我已經創建了一個基於Boost Log的記錄器機制。Boost日誌回調
我的代碼是基於如此example中所示的普通記錄器。
我想知道,每當發生致命錯誤如何自動調用系統退出
exit(1)
(或任何其他自定義的回調函數)。
歡迎任何幫助!
UPDATE:
的解決方案是extend the backend sink通過重載consume()
方法。水槽檢查瑣碎記錄的嚴重級別的
例子:
#include <boost/log/trivial.hpp>
#include <boost/log/sinks/basic_sink_backend.hpp>
#include <boost/log/attributes/value_extraction.hpp>
#include <boost/log/sinks/async_frontend.hpp>
namespace sinks = boost::log::sinks;
void initBoostLog() {
struct Sink: public sinks::basic_formatted_sink_backend<char, sinks::concurrent_feeding> {
void consume (const boost::log::record_view& rec, const string& str) {
using boost::log::trivial::severity_level;
auto severity = rec.attribute_values()[boost::log::aux::default_attribute_names::severity()].extract<severity_level>();
if (!severity || severity.get() <= severity_level::info) {
std::cout << str << std::endl;
} else {
std::cerr << str << std::endl;
}
}
};
typedef sinks::asynchronous_sink<Sink> sink_t; boost::shared_ptr<sink_t> sink (new sink_t());
boost::shared_ptr<boost::log::core> logc = boost::log::core::get();
logc->add_sink (sink);
}
是否自動調用「consume()」?因爲它似乎沒有這樣做。它彙編顯示一個警告,即現在的助推方法現在被遮蔽了。我不確定我使用同步匯的事實是否重要。 –
我的錯誤。我遺傳錯了。謝謝! –
你可以寫你自己的['升壓:: log'片(http://www.boost.org/doc/庫/ 1_54_0 /庫/日誌/ DOC/HTML /日誌/ extension.html#log.extension.sinks)。但是日誌記錄和錯誤處理是單獨的問題,你可能不應該混淆它們。另外,調用'exit()'是終止C++程序的一種不雅的方式,因爲RAII對象不會被釋放。當遇到致命的情況時,記錄它並拋出異常有什麼問題? – rhashimoto
你說得對,我確實有我的自定義接收器,'exit(1)'不夠優雅。它只發生在我的腦海/實現一個'LOG(致命)'作爲一個進程終止異常,我認爲他們可以「統一」。 –