2013-04-16 25 views
5

Tôi đang sử dụng boost::log làm trình ghi nhật ký cho chương trình C++ của mình. Trong phát triển Tôi thường sử dụng nó theo cách này, ví dụ:Cách xóa các báo cáo gỡ lỗi nhật ký khỏi chương trình

#define LOG(severity) BOOST_LOG_SEV(boost::logger::get(), (severity)) 
#define LOG_ERR LOG(Severity::error) 
#define LOG_INFO LOG(Severity::info) 
#define LOG_DEBUG LOG(Severity::debug) 

nơi BOOST_LOG_SEV là cơ sở cung cấp bởi boost::log, trong khi LOG, LOG_ERROR, LOG_INFO, LOG_DEBUG được các phím tắt được định nghĩa bởi tôi.

Tóm lại, BOOST_LOG_SEV tự động so sánh mức độ nghiêm trọng của lỗi hiện tại với mức độ nghiêm trọng được chuyển đến chính macro để quyết định có phát ra đầu ra hay không.

Đây là một ví dụ về một chương trình mà sử dụng các macro trên cho mục đích gỡ lỗi:

// set at compile time 
#define MAX_LOG_SEVERITY Severity::debug 

int main() { 
    // Print all the messages with a 
    // Severity <= MAX_LOG_SEVERITY defined before compiling 
    boost::log::set_severity(boost::logger::get(), MAX_LOG_SEVERITY); // set_severity() is fictitious just to give you an idea 

    // bool err = ... 
    if (err) 
     LOG_ERR << "An error occurred"; 
    else 
     LOG_INFO << "Okay; 
    LOG_DEBUG << "main() called"; 
} 

Bây giờ, khi phát hành chương trình cho một môi trường sản xuất, gỡ lỗi tin nhắn với mức Severity::debug không thực sự có ý nghĩa. Tôi có thể ẩn chúng khỏi đầu ra chỉ bằng cách giảm MAX_LOG_SEVERITY thành Severity::info, nhưng vấn đề là các cuộc gọi được thực hiện bởi LOG_DEBUG sẽ không bị xóa khỏi mã thực thi. Điều này có tác động xấu đến cả hiệu quả và kích thước đối tượng.

Mã có đầy đủ các tuyên bố ghi nhật ký và tôi thực sự muốn bảo toàn việc sử dụng đơn giản operator<<().

Không tự động chạm vào các câu lệnh đó, có bất kỳ định nghĩa macro/lừa nào tốt hơn cho LOG_DEBUG. hằng số Severity::debug?

Trả lời

6

Trong khi tôi không thể thực hiện bất kỳ đảm bảo, một cái gì đó như thế này có thể làm việc. Nó phụ thuộc vào những gì trình tối ưu hóa của bạn thực hiện và liệu bạn có tác dụng phụ hay không trong các tham số cho toán tử < <.

#ifdef NO_LOG_DEBUG 

static class DevNull 
{ 
} dev_null; 

template <typename T> 
DevNull & operator<<(DevNull & dest, T) 
{ 
    return dest; 
} 

#define LOG_DEBUG dev_null 

#else 

#define LOG_DEBUG LOG(Severity::debug) 

#endif 
-2

Tắt tất cả các tối ưu hóa trong chương trình và tăng tốc biên dịch.

/Od hoặc boot_log_stop

2

@ trả lời chấp nhận MartinShobe của hoạt động trên:

  • g ++ (4.7.2) với -O1 và cao hơn
  • kêu vang ++ (3.4) với -O2 và cao hơn
  • Visual Studio (2008) với cờ liên kết /OPT:REF
Các vấn đề liên quan