Sto usando boost::log
come un logger per il mio programma C++. Durante lo sviluppo Io uso spesso in questo modo, ad esempio:Come rimuovere le dichiarazioni di debug del log da un programma
#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)
dove BOOST_LOG_SEV
è lo strumento fornito dal boost::log
, mentre LOG
, LOG_ERROR
, LOG_INFO
, LOG_DEBUG
sono scorciatoie definite da me.
In breve, BOOST_LOG_SEV
confronta dinamicamente la severità di debug corrente con la gravità passata alla macro stessa per decidere se emettere o meno l'output.
Questo è un esempio di un programma che utilizza le macro di cui sopra per scopi di debug:
// 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";
}
Ora, quando si rilascia il programma per un ambiente di produzione, i messaggi di debug con un livello Severity::debug
in realtà non ha senso. Potrei nasconderli dall'output semplicemente diminuendo MAX_LOG_SEVERITY
a Severity::info
, ma il problema è che le chiamate effettuate da LOG_DEBUG
non verranno rimosse dal codice eseguibile. Ciò ha un impatto negativo sull'efficienza e sulla dimensione dell'oggetto.
Il codice è pieno di dichiarazioni di registrazione e mi piacerebbe davvero conservare il semplice utilizzo di operator<<()
.
Senza toccare tali dichiarazioni stessi, c'è qualche migliore definizione macro/trucco per LOG_DEBUG
che renderebbe il pre-processore o il compilatore (durante i suoi ottimizzazioni) "saltare" o "rimuovere" le indicazioni di debug quando MAX_LOG_SEVERITY
è impostato la costante Severity::debug
?