2016-07-11 97 views
4

我想在linux下爲boost :: log添加彩色日誌輸出。我讀the following,我想這:如何添加顏色編碼到boost :: log控制檯輸出?

#define MY_LOG_ERROR() BOOST_LOG_TRIVIAL(error) << "\033[1;31" 

MY_LOG_ERROR() << "This is an error log." 

,但它給了我下面的結果:

[2016年7月11日17:23:16.328435] [0x00007f15f03d6780] [錯誤] [1; 31This 是一個錯誤日誌。

如何正確添加彩色日誌輸出到boost :: log?

+1

你使用什麼終端?他們多次聲明,終端必須支持這些顏色代碼... – starturtle

+2

您錯過了代碼序列中的尾隨'm'。 –

回答

8

使用Boost.Log自定義輸出的正確方法是使用formatters。要設置格式化程序,您必須爲here所述的設置接收器,但可以繼續使用BOOST_LOG_TRIVIAL宏來生成日誌記錄。

格式化程序的好處在於,您可以訪問格式化程序中的日誌記錄屬性(如嚴重性級別)。例如,您可以使用嚴重性級別在控制檯上選擇格式化日誌記錄的顏色。

void coloring_formatter(
    logging::record_view const& rec, logging::formatting_ostream& strm) 
{ 
    auto severity = rec[logging::trivial::severity]; 
    if (severity) 
    { 
     // Set the color 
     switch (severity.get()) 
     { 
     case logging::trivial::severity::info: 
      strm << "\033[32m"; 
      break; 
     case logging::trivial::severity::warning: 
      strm << "\033[33m"; 
      break; 
     case logging::trivial::severity::error: 
     case logging::trivial::severity::fatal: 
      strm << "\033[31m"; 
      break; 
     default: 
      break; 
     } 
    } 

    // Format the message here... 
    strm << rec[logging::expressions::smessage]; 

    if (severity) 
    { 
     // Restore the default color 
     strm << "\033[0m"; 
    } 
} 

sink->set_formatter(&coloring_formatter); 
+0

如何在上面的代碼中將* TimeStamp *和* ThreadID *添加到日誌消息的格式中?我希望結果類似於默認的簡單日誌記錄格式。當我使用日誌記錄文件時,我只寫了'keywords :: format =「[%TimeStamp%] [%ThreadID%] [%Severity%]:%Message%」'。 – bobeff

+0

我剛剛發佈上述評論爲[新問題](http://stackoverflow.com/questions/38618094/how-to-output-timestamp-and-threadid-attributes-with-custom-boostlog-formatter)。 – bobeff

2

我最近有一個簡單的自定義接收後端

coloured_console_sink.h

#pragma once 
#include <boost/log/sinks/basic_sink_backend.hpp> 

class coloured_console_sink : public boost::log::sinks::basic_formatted_sink_backend<char, boost::log::sinks::synchronized_feeding> 
{ 
public: 
    static void consume(boost::log::record_view const& rec, string_type const& formatted_string); 
}; 

coloured_console_sink.cpp

#include "coloured_console_sink.h" 
#include <iostream> 
#include <windows.h> 
#include <boost/log/trivial.hpp> 
#include <boost/log/attributes/value_extraction.hpp> 
#include <boost/log/attributes/attribute_value.hpp> 

WORD get_colour(boost::log::trivial::severity_level level) 
{ 
    switch (level) 
    { 
     case boost::log::trivial::trace: return 0x08; 
     case boost::log::trivial::debug: return 0x07; 
     case boost::log::trivial::info: return 0x0F; 
     case boost::log::trivial::warning: return 0x0D; 
     case boost::log::trivial::error: return 0x0E; 
     case boost::log::trivial::fatal: return 0x0C; 
     default: return 0x0F; 
    } 
} 

void coloured_console_sink::consume(boost::log::record_view const& rec, string_type const& formatted_string) 
{ 
    auto level = rec.attribute_values()["Severity"].extract<boost::log::trivial::severity_level>(); 
    auto hstdout = GetStdHandle(STD_OUTPUT_HANDLE); 

    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    GetConsoleScreenBufferInfo(hstdout, &csbi); 

    SetConsoleTextAttribute(hstdout, get_colour(level.get())); 
    std::cout << formatted_string << std::endl; 
    SetConsoleTextAttribute(hstdout, csbi.wAttributes); 
} 

使用

typedef boost::log::sinks::synchronous_sink<coloured_console_sink> coloured_console_sink_t; 
auto coloured_console_sink = boost::make_shared<coloured_console_sink_t>(); 

boost::log::core::get()->add_sink(coloured_console_sink); 
01做到了這一點