La configuración de registro que tengo es bastante similar:
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)
Si su registro está deshabilitado, el ostream Nunca se crea y existe poca sobrecarga. Puede configurar el registro en el nombre de archivo & número (s) de línea o niveles de prioridad. La función ShouldLog puede cambiar entre invocaciones, por lo que puede acelerar o limitar la salida. La salida de registro utiliza dos funciones para modificarse, Prefijo que agrega un prefijo "file: line: (PRIO)" a la línea y Flush() que lo vacía al resultado de registro como un solo comando y le agrega una nueva línea. . En mi implementación, siempre lo hace, pero puede hacer eso condicional si uno no está ya allí.
Me pregunto si puedes hacer #define my_macro (blah) {std :: ostringstream oss; oss blah; ThreadSafeLogging (oss.str()); } –
Ver también: https://stackoverflow.com/questions/4446484/a-line-based-thread-safe-stdcerr-for-c –