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::logwä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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage