2014-09-03 135 views
2

我正在使用Boost 1.54 Logging API並嘗試更改控制檯日誌輸出的顏色。下面是鏈接到我使用的最小測試代碼(覺得代碼有點長,直接發佈):使用Boost日誌更改Windows控制檯中日誌輸出的顏色

http://ideone.com/o2KGw9

因此,線96級的作品,這是一個std ::法院控制檯顏色:

std::cout << colorSet(h, DARKTEAL)<<" I am coloured!!" << colorSet(h, GRAY) << std::endl;

但是,當我嘗試做相同的升壓::登錄::表達式::流,在管線77中,在打印文本沒有顏色。

logging::formatter fmtconsole = expr::stream << colorSet(h, BLUE)<< "DEBUG:" << expr::smessage << colorSet(h, GRAY) << "\n";

下面是輸出的屏幕截圖,我得到:

Console output

我記得在由安德烈Semashev升壓sourceforge上論壇閱讀信息時,有可能寫一個自定義格式化程序,它將顏色控制代碼添加到輸出中,但AFIK僅適用於Linux終端,這就是我嘗試這種方法的原因。

有沒有辦法做到這一點?

謝謝。

UPDATE:

所以我實現它是通過提供自定義格式功能Semasheve方式建議:

void my_formatter(logging::record_view const& rec, logging::formatting_ostream& strm) 
{ 
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
    // Finally, put the record message to the stream 
    boost::locale::generator gen; 
    std::locale::global(gen("")); 

    boost::locale::date_time now; 
    std::cout.imbue(std::locale()); 

    std::cout << colorSet(h, BLUE) << boost::locale::as::ftime("%H:%M:%S") << "[" << now << "] "; 
    std::cout << colorSet(h, RED) << rec[expr::smessage] << colorSet(h, GRAY); 

} 

參考主代碼鏈接查看colorSet定義。

,然後設置格式的後端,如:

consolebackend->set_formatter(&my_formatter);

不幸的是,我沒有使用formatting_ostream對象,這使得這種像不是一個很好的解決方案。我無法使用它的原因是因爲Boost刷新流的方式。所以我只會得到流中的最後一個顏色。因此我最終直接使用std :: cout。

但我確信這是可能的,不知何故。

雖然這樣做的工作,我仍然需要一個機制,我可以得到一個流作爲臨時對象,可以從宏調用。

也許是這樣的:

class TMP_LOG 
{ 
    public: 
    TMP_LOG(const Color& c) : col(c), m_str() { } 

    ~TMP_LOG() 
    { 
     HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
     SetConsoleTextAttribute(h, col); 

     BOOST_LOG_SEV(slg, normal) << m_str.str(); 

     SetConsoleTextAttribute(h, GRAY); 
    } 

    std::ostringstream& stream() { return m_str; } 

private: 
    std::ostringstream m_str; 

    Color col; 
}; 

#define LOG_DEBUG TMP_LOG(RED).stream() 
#define LOG_WARN TMP_LOG(YELLOW).stream() 

回答

1

你可能需要寫一個「懶操縱國」的東西(否則它會立即評估,而不是當實際寫入到輸出流)。

這將是非常棘手。

相反,您可以使用具有ANSI功能的終端仿真程序。

我的首選武器是mintty,但其他的Windows存在太多

+0

感謝您的答覆。使用具有ANSI能力的仿真器不適合我,因爲發行版軟件將安裝在我無法控制的機器上。我寫了一個可行的黑客攻擊,儘管我寧願採用更好的方法。我將發佈代碼作爲感興趣的各方的答案。由於這種情況下的用例,我不確定操縱器是否可以工作,但我認爲這是其他情況下的解決方案。 – 2014-09-04 11:42:43

相關問題