Настройка протоколирования У меня есть очень похожа:
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)
Если ведение журнала отключено, то ostream никогда не создается и мало накладных расходов существует. Вы можете настроить ведение журнала на имя файла & номер (номера) линии или уровни приоритета. Функция ShouldLog может меняться между вызовами, поэтому вы можете дросселировать или ограничивать вывод. Выход журнала использует две функции для само модификации: префикс, который добавляет префикс «file: line: (PRIO)» в строку, и Flush(), который одновременно сбрасывает его на выход журнала как одну команду и добавляет к нему новую строку , В моей реализации это всегда делает, но вы можете сделать это условным, если его еще нет.
Интересно, можете ли вы сделать #define my_macro (blah) {std :: ostringstream oss; oss blah; ThreadSafeLogging (oss.str()); } –
См. Также: https://stackoverflow.com/questions/4446484/a-line-based-thread-safe-stdcerr-for-c –