2016-01-21 54 views
0

這是我如何設置我的記錄器:升壓登錄格式化使用相同字符串作爲關鍵字

namespace logger = boost::log; 
namespace src = boost::log::sources; 
namespace sinks = boost::log::sinks; 
namespace expr = boost::log::expressions; 
using LEVEL = boost::log::trivial::severity_level; 


static void log_Severity(LEVEL level, sender_t sender, std::string message); 
static void throw_Severity(LEVEL level, sender_t sender, std::string message); 
static std::string getUnescaped(std::string input); 
static std::string format(sender_t sender, std::string message);; 
static std::string HRESULTSTRING(HRESULT result); 

typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink; 

static std::string CreateFormat() 
{ 
    logger::add_common_attributes(); 
    logger::register_simple_formatter_factory< LEVEL, char >("Severity"); 
    return "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"; 
} 

static void AddTerminalLogger(std::string format) 
{ 
    auto sink = boost::make_shared<text_sink>(); 
    sink->locked_backend()->add_stream(boost::shared_ptr<std::ostream>(&std::cout, boost::null_deleter())); 
    sink->locked_backend()->auto_flush(true); 
    //sink->set_formatter(format); 
    logger::core::get()->add_sink(sink); 
} 

static void AddFileLogger(std::string path, std::string format) 
{ 
    logger::add_file_log 
     (
     logger::keywords::file_name = path + "ManualTest_%Y-%m-%d_%H-%M-%S.%N.log", 
     logger::keywords::rotation_size = 10 * 1024 * 1024, 
     logger::keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), 
     logger::keywords::format = format 
     ); 
} 

static void SetLogLevel(LEVEL level) 
{ 
    logger::core::get()->set_filter(logger::trivial::severity >= level); 
} 

void LogHelper::SetupLoggers(std::string path) 
{ 
    std::string format = CreateFormat(); 
    AddFileLogger(path, format); 
    AddTerminalLogger(format); 
    SetLogLevel(LEVEL::trace); 
} 

我想用我現有的格式字符串設置我的控制檯日誌記錄以及。 如何重複使用"[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%",以便在創建格式表達式時不重複自己?

編輯: 爲了澄清:這是不是有效,據我所知:sink->set_formatter(expr::format("[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"));如果我想使用set_formatter我會寫,做同樣的事情,因爲這logger::keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"的表達式。如果我這樣做,我會使用每個記錄器(終端,文件)的一種方法,希望在兩者中獲得相同的格式。兩個記錄器都是添加到核心的接收器。所以我假設方法logger::add_file_log在引擎蓋下使用類似set_formatter的東西。我想使用在某個地方建立的功能,這些功能將允許我將字符串"[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"應用於接收器。雖然我找不到文檔。當我查看這個主題時,我確實發現瞭如何使用set_formatter,但最終總是在開發不同的東西時得到相同的結果。我覺得這會帶來錯誤的可能性,因爲我只是重複一下自己,因爲我只是在略有變化的情況下重寫我想要的格式。

編輯: 更改了源代碼以更好地反映問題。

+0

使其成爲全局常量或#define?或者我錯過了什麼? – AaronI

+0

嗯,我應該改進我的問題,這不是關於如何將事情作爲參數傳遞。這是關於如何表達式比記錄器關鍵字更復雜。我想用一種方法來做這件事,而不是保持兩種做同樣事情的方式。 – Johannes

回答

1

首先,您可以使用add_console_log函數,類似於您在代碼中使用add_file_log的方式。

其次,這兩個函數都使用formatter parserparse_formatter函數)將格式字符串轉換爲您可以提供給set_formatter的實際格式化程序。您可以直接使用此函數來避免多次解析字符串。

相關問題