Я использую 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
не.
Есть ли у вас какие-либо подсказки, что не так с инициализацией тестов и регистраторов в моем коде? Должен ли я использовать два регистратора в моей библиотеке или один с двумя файлами?
Нет необходимости иметь два отдельных регистратора. Это только усложнит вашу логику. У вас должен быть один регистратор, для которого вы будете устанавливать уровень детализации в зависимости от типа сборки. Что-то вроде этого:
#ifdef RELEASE
logger->set_level(spdlog::level::info);
#else
logger->set_level(spdlog::level::debug);
#endif
Таким образом, при сборке в режиме релиза регистратор будет только регистрировать Информация сообщения, в то время как в режиме выпуска он будет регистрировать и то и другое Информация а также отлаживать.
Тот факт, что ваш отладчик сохраняет Информация логи тоже ничего странного. Почти все библиотеки журналов используют этот подход. Они имеют разные уровни детализации каротажа. Например: Информация, предупреждение, отлаживать а также подробный. Затем, когда вы установите уровень предупреждение, только предупреждение а также Информация будет зарегистрирован, а если вы выберете, например, подробный, тогда все типы будут зарегистрированы.
РЕДАКТИРОВАТЬ:
Если вам действительно нужно разделить журналы по типу на разные файлы, вы можете написать простой сценарий, чтобы сделать это, используя предпочитаемый язык сценариев. Я предполагаю, что журналы из этой библиотеки помечены их типом. Вы можете использовать это для анализа выходного файла и извлечения журналов определенного типа в отдельный файл. Это довольно легко сделать. Наличие только двух регистраторов усложняет ситуацию и влечет за собой снижение производительности, что важно, если ваш набор тестов становится большим.
Из-за очень длительного выполнения моих тестов я убивал процесс. debug
логи сохранялись всегда в обоих файлах, info
журналы нет. Это было вызвано политикой флеша в spdlog
(debug
уровень важнее и его сбрасывали очень часто — полагаю, что почти после каждого звонка).
info
журналы сбрасываются после всех тестов (не после каждого теста или каждого тестового класса). Вот почему мои файлы всегда были пустыми (я убил процесс).
Можно изменить политику сброса для регистратора путем
logger->flush_on(spdlog::level::info);