2015-04-21 11 views
3

我一直在嘗試了幾天,現在創建整個應用程序一個促進全球記錄儀使用,但我似乎無法獲得嚴重性級別在全局設置記錄器C++如何設置嚴重性過濾器上的加速全局記錄

重要提示:下面的安德烈的回答

看...它打成步驟(a)和(b),但我仍然沒有得到它的權利!


右出Boost文檔here

的......這將是在 爲了一個或幾個全球記錄器在需要時方便地訪問它們的每一個地方更方便。在這方面, std :: cout是這種記錄器的一個很好的例子。

庫提供一種方式來聲明全局記錄器,可以是 訪問很像的std ::法院。實際上,此功能可以與任何記錄器(包括用戶定義的記錄器)一起使用 。在聲明瞭全局的 記錄器之後,可以肯定的是從應用程序代碼的任何地方對該記錄器 實例進行線程安全訪問。庫也保證即使跨越 模塊邊界,全局記錄器實例也是唯一的。這使得即使在只有頭文件的 組件中也可以使用日誌記錄,這些組件可能會被編譯到不同的模塊中。


無論您使用的聲明記錄器的宏,你可以 與記錄 標籤的靜態get函數獲取記錄器實例:

src::severity_logger_mt< >& lg = my_logger::get(); 

我從發現Boost Logger大師安德烈,說我的問題是嚴重類型不匹配

您已使用默認模板 參數實例化severity_logger_mt,因此嚴重性級別屬性的類型爲int。您的枚舉 值將轉換爲int併發送到日誌記錄核心。您沒有設置任何接收器,因此默認情況下會使用默認接收器。接收器 嘗試從日誌記錄 中提取嚴重級別屬性值,但未能這樣做,因爲它預期嚴重性級別爲 類型boost :: log :: trivial :: severity_level。在失敗之後,接收器 回落到boost :: log :: trivial :: severity_level :: info嚴重性。

如果你想用你的枚舉你必須嚴重性級別:

------------------------- -----------(現在,這是ANSWER !!!!)---------------------------------------

(a )在記錄器模板參數中指定它並且

(b)用格式化器建立一個接收器,它知道你的枚舉。

但我無法弄清楚如何做到這一點,因爲即使嘗試後按照他的指示嚴重級別看起來像水槽仍回落到了boost ::登錄::瑣碎:: severity_level :: info嚴重性。任何人都可以幫助我弄清楚如何在我的全局記錄器中正確設置嚴重性?下面是代碼:

HEADER

#include <boost/log/trivial.hpp> 
#include <boost/log/sources/global_logger_storage.hpp> 

enum severity_level 
{ 
    normal, 
    warning, 
    error, 
    critical 
}; 

BOOST_LOG_GLOBAL_LOGGER(logger, boost::log::sources::severity_logger_mt<severity_level>) 

CPP

#include "GlobalLogger.h" 

#include <boost/log/expressions/formatters/date_time.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/sync_frontend.hpp> 
#include <boost/log/sinks/text_ostream_backend.hpp> 
#include <boost/log/support/date_time.hpp> 
#include <boost/core/null_deleter.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/make_shared.hpp> 
#include <boost/log/utility/setup/file.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/sinks.hpp> 
#include <fstream> 

namespace logging = boost::log; 
namespace src = boost::log::sources; 
namespace expr = boost::log::expressions; 
namespace sinks = boost::log::sinks; 
namespace attrs = boost::log::attributes; 

bool onlyWarnings(const boost::log::attribute_value_set& set) 
{ 
    return set["Severity"].extract<severity_level>() > 0; 
} 

void severity_and_message(const boost::log::record_view &view, boost::log::formatting_ostream &os) 
{ 
    os << view.attribute_values()["Severity"].extract<severity_level>() << ": " << 
    view.attribute_values()["Message"].extract<std::string>(); 
} 

BOOST_LOG_GLOBAL_LOGGER_INIT(logger, boost::log::sources::severity_logger_mt<severity_level>) 
{ 
    boost::log::sources::severity_logger_mt<severity_level> logger; 

    // add a text sink 
    typedef sinks::asynchronous_sink<sinks::text_ostream_backend> text_sink; 
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>(); 

    // add "console" output stream to our sink 
    boost::shared_ptr<std::ostream> stream{&std::clog, boost::null_deleter{}}; 
    sink->locked_backend()->add_stream(stream); 

    // specify the format of the log message 
    sink->set_formatter(&severity_and_message); 

    // just log messages with severity >= SEVERITY_THRESHOLD are written 
    sink->set_filter(&onlyWarnings); 

    // "register" our sink 
    logging::core::get()->add_sink(sink); 

    logging::add_common_attributes(); 

    return logger; 
} 

的main.cpp

#include <iostream> 

#include "GlobalLogger.h" 

using namespace std; 

int main() { 
    boost::log::sources::severity_logger_mt<severity_level>& lg = logger::get(); 
    BOOST_LOG_SEV(lg, severity_level::normal) << "note"; 
    BOOST_LOG_SEV(lg, severity_level::warning) << "warning"; 
    BOOST_LOG_SEV(lg, severity_level::critical) << "critical"; 

    return 0; 
} 

我發現了一個更好的例子62.10. A macro to define a global loggerthis SO question的工作版本。但該工作示例不使用get()方法。因此,在聲明瞭BOOST_LOG_GLOBAL_LOGGER之後,我可以訪問log :: get(),但我仍然無法識別嚴重性

回答

4

我找到了Andrey,Boost Log專家。爲了幫助未來的其他人,我發佈了一個鏈接到我們的Sourceforge discussion。在我的監視器上敲擊了我的頭部之後,他花了他的解釋並重新訪問this SO question的工作版本。但我終於搞定了!好極了!!!

相關問題