2016-07-11 9 views
4

나는 리눅스에서 boost :: log에 색깔있는 로그 출력을 추가하려고한다. I는 the following 읽고 I이 시도 :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] 31이 은 오류 로그입니다.

부울 로그 출력을 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 이런 짓을했습니다