2015-07-20 86 views
1

我已經看到了幾個格式化程序的例子,但那些使用了自定義的定義屬性。增強日誌 - 使用severity_channel_logger格式化

如何指定severity_channel_logger的格式?我現在得到的是:

[2015-07-20 11:53:09.879305] [0x00007f047b525740] [trace] Bla, bla bla, bla bla bla. 
[2015-07-20 11:53:09.879370] [0x00007f047b525740] [trace] Bla, bla bla, bla bla bla. 
[2015-07-20 11:53:09.879376] [0x00007f047b525740] [fatal] Bla, bla bla, bla bla bla. 

logger.h

#ifndef LOGGER_H_ 
#define LOGGER_H_ 

#include <boost/log/trivial.hpp> 
#include <boost/log/core.hpp> 
#include <boost/log/sources/global_logger_storage.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/sources/channel_feature.hpp> 
#include <boost/log/sources/severity_channel_logger.hpp> 

#include <string> 

namespace Logging { 

typedef boost::log::sources::severity_channel_logger<boost::log::trivial::severity_level,std::string> LoggerType; 

BOOST_LOG_GLOBAL_LOGGER(clogger,LoggerType) 

} // namespace Logging 

#endif 

logger.cpp

#include "logger.h" 
#include <memory> 

#include <boost/log/core/core.hpp> 
#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/sources/severity_logger.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/shared_ptr.hpp> 

using namespace Logging; 

BOOST_LOG_GLOBAL_LOGGER_INIT(clogger, LoggerType) 
{ 
    boost::log::sources::severity_channel_logger< boost::log::trivial::severity_level, std::string > lg; 
    return lg; 
} 

的main.cpp

#include "logger.h" 
#include <boost/log/attributes/named_scope.hpp> 
using namespace Logging; 

int main() 
{ 
    BOOST_LOG_FUNCTION(); 
    BOOST_LOG(clogger::get()) << "Bla, bla bla, bla bla bla."; 
    BOOST_LOG_CHANNEL(clogger::get(),"standard") << "Bla, bla bla, bla bla bla."; 
    BOOST_LOG_CHANNEL_SEV(clogger::get(),"standard",boost::log::trivial::fatal) << "Bla, bla bla, bla bla bla."; 
} 
+0

你使用什麼樣的代碼? – sehe

+1

@sehe新增完整的代碼。 –

回答

1

您需要將格式器設置到您的接收器。格式化程序可以在multiple ways中定義,但底線是它從日誌記錄中提取屬性值並將它們放入字符串中。這些屬性是由用戶還是庫定義都無關緊要 - 您只需要屬性名稱及其值的類型即可。

severity_channel_logger是一個複合記錄器,它將severity levelchannel插入到通過該記錄器創建的日誌記錄中。因此,您將從文檔中瞭解到屬性名稱分別爲「Severity」和「Channel」,屬性值類型是您指定爲記錄器模板參數的類型 - boost::log::trivial::severity_levelstd::string

現在您可以將格式化器設置爲您的接收器。例如:

namespace expr = boost::log::expressions; 

sink->set_formatter(
    expr::stream 
     << expr::attr<boost::log::trivial::severity_level>("Severity") 
     << " [" << expr::attr<std::string>("Channel") << "]: " 
     << expr::smessage; 
); 
+0

謝謝,只是一個小問題。沒有格式化程序,輸出包含時間戳。如何在格式化程序中打印時間戳? '「TimeStamp」'似乎並不存在,即使它在其他例子中使用。我通過註冊一個新的全局時鐘來解決這個問題,但是在添加格式化程序之前,時間戳已經存在了,所以它到了哪裏? –

+0

默認情況下沒有註冊屬性,甚至沒有時間戳。你必須自己添加它(我認爲,當你添加一個時鐘屬性時你會這樣做)。 要將時間戳記添加到格式化程序,您可以使用''''expr :: attr'',它將以默認格式輸出時間戳或['''expr :: format_date_time'''] [1]一種定製它的方法。 [1]:http://www.boost.org/doc/libs/1_58_0/libs/log/doc/html/log/detailed/expressions.html#log.detailed.expressions.formatters.date_time –

0

其實,有很多介紹boost.org。現在我給我的代碼:

#include <fstream> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/make_shared_object.hpp> 
#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/sync_frontend.hpp> 
#include <boost/log/sinks/text_ostream_backend.hpp> 
#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/support/date_time.hpp> 

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

void init() 
{ 
    typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink; 
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>(); 

    sink->locked_backend()->add_stream(
     boost::make_shared<std::ofstream>("sample.log")); 

    sink->set_formatter 
    (
     expr::stream 
      // line id will be written in hex, 8-digits, zero-filled 
     << expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d, %H:%M:%S") 
     << std::hex << std::setw(8) << std::setfill('0') << expr::attr< unsigned int >("LineID") 
     << ": <" << logging::trivial::severity 
     << "> " << expr::smessage 
); 

logging::core::get()->add_sink(sink); 
} 

int main() 
{ 
init(); 
logging::add_common_attributes(); 

using namespace logging::trivial; 
src::severity_logger<severity_level> lg; 

BOOST_LOG_SEV(lg, trace) << "A trace severity message"; 
BOOST_LOG_SEV(lg, debug) << "A debug severity message"; 
BOOST_LOG_SEV(lg, info) << "An informational severity message"; 
BOOST_LOG_SEV(lg, warning) << "A warning severity message"; 
BOOST_LOG_SEV(lg, error) << "An error severity message"; 
BOOST_LOG_SEV(lg, fatal) << "A fatal severity message"; 

return 0; 

}

根據我的代碼,你會得到一個sample.log格式輸出。它會顯示與timestamplog level。欲瞭解更多詳情,你應該去現場[http://www.boost.org/doc/libs/1_58_0/libs/log/example/doc/tutorial_fmt_format.cpp]。我希望這可以幫助你。順便說一下,輸出是:

2015-07-20, 23:19:0200000001: <trace> A trace severity message 
2015-07-20, 23:19:0200000002: <debug> A debug severity message 
2015-07-20, 23:19:0200000003: <info> An informational severity message 
2015-07-20, 23:19:0200000004: <warning> A warning severity message 
2015-07-20, 23:19:0200000005: <error> An error severity message 
2015-07-20, 23:19:0200000006: <fatal> A fatal severity message