So entfernen Sie Protokoll-Debugging-Anweisungen aus einem Programm
ich benutzeboost::log
als Logger für mein C ++ Programm. Während der Entwicklung benutze ich es oft so, zum Beispiel:
#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)
woherBOOST_LOG_SEV
ist die Einrichtung vonboost::log
währendLOG
, LOG_ERROR
, LOG_INFO
, LOG_DEBUG
sind von mir definierte Verknüpfungen.
Zusamenfassend,BOOST_LOG_SEV
vergleicht dynamisch den aktuellen Debug-Schweregrad mit dem an das Makro selbst übergebenen Schweregrad, um zu entscheiden, ob die Ausgabe ausgegeben werden soll oder nicht.
Dies ist ein Beispiel für ein Programm, das die obigen Makros zum Debuggen verwendet:
// 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";
}
Wenn Sie das Programm jetzt für eine Produktionsumgebung freigeben, debuggen Sie Nachrichten mit einemSeverity::debug
Niveau nicht wirklich sinnvoll. Ich könnte sie durch einfaches Verringern vor der Ausgabe verbergenMAX_LOG_SEVERITY
zuSeverity::info
, aber das problem ist, dass die anrufe vonLOG_DEBUG
wird nicht aus dem ausführbaren Code entfernt. Dies hat negative Auswirkungen auf die Effizienz und die Objektgröße.
Der Code ist voll von Protokollierungsanweisungen und ich möchte die einfache Verwendung von wirklich beibehaltenoperator<<()
.
Gibt es eine bessere Makrodefinition / einen besseren Trick, ohne diese Aussagen selbst zu berühren?LOG_DEBUG
Das würde dazu führen, dass der Pre-Prozessor oder der Compiler (während seiner Optimierungen) die Debug-Anweisungen "überspringt" oder "entfernt", wennMAX_LOG_SEVERITY
ist auf die eingestelltSeverity::debug
konstant?