我正在使用Boost 1.54 Logging API並嘗試更改控制檯日誌輸出的顏色。下面是鏈接到我使用的最小測試代碼(覺得代碼有點長,直接發佈):使用Boost日誌更改Windows控制檯中日誌輸出的顏色
因此,線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";
下面是輸出的屏幕截圖,我得到:
我記得在由安德烈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()
感謝您的答覆。使用具有ANSI能力的仿真器不適合我,因爲發行版軟件將安裝在我無法控制的機器上。我寫了一個可行的黑客攻擊,儘管我寧願採用更好的方法。我將發佈代碼作爲感興趣的各方的答案。由於這種情況下的用例,我不確定操縱器是否可以工作,但我認爲這是其他情況下的解決方案。 – 2014-09-04 11:42:43