Como remover instruções de depuração de log de um programa

estou usandoboost::log como um logger para o meu programa C ++. Durante o desenvolvimento, eu geralmente uso dessa maneira, por exemplo:

#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)

OndeBOOST_LOG_SEV é a facilidade fornecida porboost::log, enquantoLOG, LOG_ERROR, LOG_INFO, LOG_DEBUG são atalhos definidos por mim.

Em resumo,BOOST_LOG_SEV compara dinamicamente a gravidade de depuração atual com a gravidade passada à própria macro para decidir se deve emitir a saída ou não.

Este é um exemplo de um programa que usa as macros acima para fins de depuração:

// 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";
}

Agora, ao liberar o programa para um ambiente de produção, depurando mensagens com umSeverity::debug nível realmente não faz sentido. Eu poderia escondê-los da saída simplesmente diminuindoMAX_LOG_SEVERITY paraSeverity::info, mas o problema é que as chamadas feitas porLOG_DEBUG não será removido do código executável. Isso tem um impacto ruim na eficiência e no tamanho do objeto.

O código está cheio de declarações de log e eu realmente gostaria de preservar o uso simples deoperator<<().

Sem tocar nessas declarações, existe alguma melhor definição de macro / truque paraLOG_DEBUG Isso faria com que o pré-processador ou o compilador (durante suas otimizações) "pular" ou "remover" as instruções de depuração quandoMAX_LOG_SEVERITY está definido para oSeverity::debug constante?

questionAnswers(3)

yourAnswerToTheQuestion