La messa a punto di registrazione che ho è abbastanza simile:
bool ShouldLog(const char* file, size_t line, Priority prio);
class LoggerOutput : public std::stringstream {
public:
LoggerOutput(const char* file, size_t line, Priority prio)
: prio(prio)
{
Prefix(file, line, prio);
}
void Prefix(const char* file, size_t line, Priority prio);
~LoggerOutput() {
Flush();
}
void Flush();
private:
Priority prio;
};
#define LOG(Prio) if (!Logging::ShouldLog(__FILE__, __LINE__, Prio)) {} else Logging::LoggerOutput(__FILE__, __LINE__, Prio)
Se la registrazione è disattivata, l'ostream viene mai creato ed esiste poco overhead. È possibile configurare la registrazione sul nome file & numero/i di riga o livelli di priorità. La funzione ShouldLog può cambiare tra le invocazioni, in modo da poter limitare o limitare l'output. L'output del registro utilizza due funzioni per modificare se stesso, Prefisso che aggiunge un prefisso "file: line: (PRIO)" alla riga e Flush() che lo svuota sull'output del log come un singolo comando e aggiunge una nuova riga ad esso . Nella mia implementazione lo fa sempre, ma puoi renderlo condizionale se non lo sei già.
Mi chiedo se si può fare #define my_macro (blah) {std :: ostringstream oss; oss blah; ThreadSafeLogging (oss.str()); } –
Vedi anche: https://stackoverflow.com/questions/4446484/a-line-based-thread-safe-stdcerr-for-c –