2013-08-02 16 views
10

Tôi đang sử dụng tăng 1.54.0. Dưới đây bạn có thể tìm thấy một ví dụ tối thiểu minh họa vấn đề của tôi.Tăng cường nhật ký severity_logger init_from_stream

Tôi sử dụng mức độ nghiêm trọng_logger nhật ký tăng cường. Tôi muốn định cấu hình bồn của mình từ một luồng. (Trong ví dụ sau tôi sử dụng một chuỗi. Trong ứng dụng thực sự của tôi, luồng xuất phát từ một tệp.) Tôi muốn sử dụng% Severity% cho mục đích đầu ra hoặc lọc.

My vấn đề là: Nếu tôi sử dụng nó như được nêu trong ví dụ bên dưới, % Mức độ nghiêm trọng% trống.

% Dòng ID% và% Message% được điền như mong đợi. Nếu tôi thiết lập một bồn rửa như được đưa ra trong các dòng outcommented, nó hoạt động như mong đợi.

Bất kỳ ý tưởng nào?

#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/utility/setup/from_stream.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/expressions.hpp> 

enum SeverityLevel { trace, fatal }; 

int main (int argc, char *argv[]) 
{ 
    boost::log::add_common_attributes(); 
    /* 
    struct severity_tag; 
    boost::log::add_console_log(std::clog, 
     boost::log::keywords::format = (
      boost::log::expressions::stream 
       << boost::log::expressions::attr< unsigned int >("LineID") 
       << ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity") 
       << "> " << boost::log::expressions::smessage) 
    ); */ 

    std::stringstream s; 
    s << "[Sinks.MySink]" << std::endl; 
    s << "Destination=Console" << std::endl; 
    s << "Format=\"%LineID%: <%Severity%> - %Message%\"" << std::endl; 
    boost::log::init_from_stream(s); 

    boost::log::sources::severity_logger<SeverityLevel> lg; 
    BOOST_LOG_SEV(lg, trace) << "This is a trace message"; 
    BOOST_LOG_SEV(lg, fatal) << "This is a fatal message"; 
    return 0; 
} 
+0

Nó sẽ appeat bạn cần hướng dẫn Boost Log thực sự sử dụng 'Sinks.MySink'. Đáng buồn thay, tôi không có kinh nghiệm với cấu hình Boost Log – sehe

+0

Đó không phải là vấn đề. Nó đang sử dụng MySink. Định dạng tôi cung cấp được sử dụng như mong muốn. Ngoại trừ:% Severity% được thay thế bằng một chuỗi rỗng. Nó phải là số của giá trị enum. Nó hoạt động tốt với cách cấu hình bồn rửa. – SebastianK

Trả lời

10

Bạn nói đúng. Đây là một lỗi đã biết và được sửa trong phiên bản phát triển hiện tại.

Đây là báo cáo lỗi: https://svn.boost.org/trac/boost/ticket/8840

Để làm cho câu trả lời này ít phụ thuộc vào liên kết ở đây là cách thức mà nó đã được giải quyết trong báo cáo:

Bạn cần phải đăng ký thuộc tính mức độ nghiêm trọng của mình trong thư viện trước khi phân tích cú pháp tệp cài đặt. Xem here. Thuộc tính có thể phải được đăng ký cho cả trình định dạng và bộ lọc phân tích cú pháp, nếu bạn muốn lọc các bản ghi dựa trên mức độ nghiêm trọng.

OK, điều này đang làm việc nhưng tôi đã phải thêm một input stream/chức năng khai thác và sau đó tôi đã phải thêm hai dòng sau đây trước khi tải cài đặt từ các thiết lập file:

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity"); 
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
+2

Bạn là người đàn ông. Đã cho tôi 2 ngày cho đến khi tôi tình cờ gặp bài viết của bạn vì tôi tin rằng tôi đã tạo một lỗi cấu hình ... – quaylar

+2

Vài năm sau ... Boost là phiên bản 1.62 và tôi đã gặp vấn đề tương tự trong 2 ngày qua. Nhờ câu trả lời này tôi đã có thể làm cho "Mức độ nghiêm trọng" hoạt động. – Rado