За първи път експериментирах с Boost.Log и бързо се натъкнах на проблеми. Следният прост код не работи правилно за мен
#include <boost/log/common.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/sources/logger.hpp>
namespace logging = boost::log;
namespace src = boost::log::sources;
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, src::logger)
static void init()
{
logging::add_file_log("test.log");
}
int main(int, char* [])
{
init();
BOOST_LOG(my_logger::get()) << "hello, world";
return 0;
}
Проблемът е, че регистрационният файл се записва във файл, наречен 00000.log
вместо искания test.log
. Проучвайки малко, изглежда проблемът е, че аргументът "test.log"
не се предава на вътрешните класове на Boost.Log и когато това се случи, се използва шаблон на файл по подразбиране от "%N.log"
, което води до името на файла 00000.log
, което виждам.
Boost.Log използва Boost.Parameter за внедряване на именувани параметри, така че се опитах да бъда изричен за параметъра, който използвам
logging::add_file_log(logging::keywords::file_name = "test.log");
Това се проваля по същия начин. Интересно е обаче, че ако предам два параметъра, кодът работи правилно, напр.
logging::add_file_log(logging::keywords::file_name = "test.log",
logging::keywords::auto_flush = true);
Не успях да определя къде е грешката, може да е Boost.Log, Boost.Parameter или грешка в компилатора. Това, което търся, е някакво обяснение за природата на грешката. Мога да заобиколя този конкретен проблем, както е показано по-горе, но ако има нещо фундаментално нередно с предаването на параметър в Boost.Log, това е доста сериозно. Ако някой има опит с тази грешка или ако може да изпробва горния код на своята платформа, ще съм благодарен.
Използвам Boost 1.74.0 и Visual Studio 2019 и C++17. Използвам статични библиотеки Boost, които са свързани статично с C++ runtime.