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
?