Spdlog logger с gtest framework не работает

Я использую spdlog и gtest в моей библиотеке. Мне нужно сохранить некоторые журналы (не журналы gtest) от выполнения теста в файлы. Вот код для создания регистраторов:

void createLogger() {
auto debug_logger = spdlog::rotating_logger_mt("debug_logger", "logs/test_debug", 1024 * 1024 * 25, 3);
debug_logger->set_level(spdlog::level::debug);
auto logger = spdlog::rotating_logger_mt("logger", "logs/test_info", 1024 * 1024 * 5, 2);
}

Это прекрасно работает в примере программы с моей библиотекой. Когда я запускаю тесты debug_logger сохраняет все в файлах, но logger ничего не экономит. Когда я удаляю

debug_logger->set_level(spdlog::level::debug);

debug_logger тоже не работает. Поэтому я подумал, что это проблема с регистраторами, но когда я добавляю

logger->set_level(spdlog::level::info);

это все еще не работает.

Вот главное для тестов:

int main(int argc, char **argv) {
try {
utility::createLogger();
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
} catch (const spdlog::spdlog_ex& ex) {
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}

Настройка и один из тестовых случаев:

class CPUTest: public ::testing::Test {

protected:

std::shared_ptr<spdlog::logger> logger;

void SetUp() {
spdlog::get("logger")->info("test get");
logger = spdlog::get("logger");
}
};

TEST_F(CPUTest, Resolve15) {
logger->info("Something from info logger");
// ...
}

debug_logger с уровнем debug экономит info логи тоже но logger с debug не.

Есть ли у вас какие-либо подсказки, что не так с инициализацией тестов и регистраторов в моем коде? Должен ли я использовать два регистратора в моей библиотеке или один с двумя файлами?

1

Решение

Нет необходимости иметь два отдельных регистратора. Это только усложнит вашу логику. У вас должен быть один регистратор, для которого вы будете устанавливать уровень детализации в зависимости от типа сборки. Что-то вроде этого:

#ifdef RELEASE
logger->set_level(spdlog::level::info);
#else
logger->set_level(spdlog::level::debug);
#endif

Таким образом, при сборке в режиме релиза регистратор будет только регистрировать Информация сообщения, в то время как в режиме выпуска он будет регистрировать и то и другое Информация а также отлаживать.

Тот факт, что ваш отладчик сохраняет Информация логи тоже ничего странного. Почти все библиотеки журналов используют этот подход. Они имеют разные уровни детализации каротажа. Например: Информация, предупреждение, отлаживать а также подробный. Затем, когда вы установите уровень предупреждение, только предупреждение а также Информация будет зарегистрирован, а если вы выберете, например, подробный, тогда все типы будут зарегистрированы.

РЕДАКТИРОВАТЬ:
Если вам действительно нужно разделить журналы по типу на разные файлы, вы можете написать простой сценарий, чтобы сделать это, используя предпочитаемый язык сценариев. Я предполагаю, что журналы из этой библиотеки помечены их типом. Вы можете использовать это для анализа выходного файла и извлечения журналов определенного типа в отдельный файл. Это довольно легко сделать. Наличие только двух регистраторов усложняет ситуацию и влечет за собой снижение производительности, что важно, если ваш набор тестов становится большим.

1

Другие решения

Из-за очень длительного выполнения моих тестов я убивал процесс. debug логи сохранялись всегда в обоих файлах, info журналы нет. Это было вызвано политикой флеша в spdlog (debug уровень важнее и его сбрасывали очень часто — полагаю, что почти после каждого звонка).

info журналы сбрасываются после всех тестов (не после каждого теста или каждого тестового класса). Вот почему мои файлы всегда были пустыми (я убил процесс).

Можно изменить политику сброса для регистратора путем

logger->flush_on(spdlog::level::info);
0

По вопросам рекламы [email protected]