Известны проблемы с Boost.Filesystem (например, #8642 и #9219), которые влияют на Boost. Лог-файл раковины backends. Когда поглотитель файла разрушается, он пытается выполнить окончательное вращение файла журнала, которое включает в себя Boost.Filesystem для перемещения файлов. Обычно это происходит при повышении. Ядро журнала деинициализируется на этапе глобальной деинициализации после выхода main()
. Суть проблемы заключается в том, что Boost.Filesystem использует объект глобальной локализации внутренне для выполнения преобразования кода символов для path
s, и эта локализация может быть уничтожена до Boost. Лог деинициализируется, что приводит к аварии.
Нет никакого способа увеличить. Войдите, чтобы повлиять на порядок глобальной деинициализации, но проблема может быть решена со стороны пользователя. Одним из решений является обеспечение инициализации локализации до Boost.Log. Это может быть достигнуто путем вызова boost::path::codecvt()
или boost::path::imbue()
на ранней стадии запуска приложения, перед выполнением любых вызовов на Boost. Лог. Например:
int main(int argc, char* argv[])
{
boost::filesystem::path::imbue(std::locale("C"));
initialize_log();
}
Обратите внимание, что в этом случае вы не можете использовать Boost. Войдите в глобальные конструкторы или убедитесь, что boost::filesystem::path::imbue()
по-прежнему называется первым.
Другое решение заключается в удалении и уничтожении поглотителей файлов из ядра регистрации перед возвращением из main()
. Таким образом, вращение файла происходит перед выходом main()
, в то время как локализация все еще действительна. Поглотители файлов могут быть удалены по отдельности или как часть вызова remove_all_sinks()
:
int main(int argc, char* argv[])
{
logging::core::get()->remove_all_sinks();
return 0;
}