Необработанное исключение из boost :: log, когда целевой файл пути начинается с точки (‘.’)

У меня есть некоторые проблемы с boost :: log, когда целевой путь начинается с точки (‘.’). Вот мой код (упрощенный, но скомпилированный):

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup.hpp>
#include <boost/log/sources/logger.hpp>

void SetupLog()
{
static bool alreadyInitialized = false;
if( alreadyInitialized )
return;

alreadyInitialized = true;

auto sink = boost::log::add_file_log(
boost::log::keywords::target = ".log",
boost::log::keywords::file_name = "sample_%2N.log");

boost::log::add_common_attributes();
}

typedef ::boost::log::sources::logger Logger;

class Engine {
public:
Engine() {
SetupLog();
BOOST_LOG( logger ) << "Engine initialized";
}

private:
Logger logger;
};int main(int argc, char* argv[])
{
Engine engine;

return 0;
}

Если я вызову SetupLog до создания экземпляра Engine (и до создания logger), то он будет работать правильно. Также журнал будет исправлен, если я изменю цель на «_log» (без точки в начале), или даже если я вообще опущу строку с целью и включу путь к ключевым словам :: имя_файла:

auto sink = boost::log::add_file_log(
boost::log::keywords::file_name = ".log/sample_%2N.log");

Но когда я пытаюсь запустить первый вариант, то:

1) если каталог «.log» не существует или он пустой, то эта папка будет создана, но журнал будет сохранен в рабочем каталоге, но не по этому пути (не существует необработанных исключений);

2) если этот каталог уже содержит несколько журналов, то у меня возникает странное исключение после запуска программы:

    msvcp120d.dll!6ff0732b()    Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for msvcp120d.dll]
>   JustSandbox.exe!`anonymous namespace'::convert_aux(const wchar_t * from, const wchar_t * from_end, char * to, char * to_end, std::basic_string<char,std::char_traits<char>,std::allocator<char> > & target, const std::codecvt<wchar_t,char,int> & cvt) Line 111    C++
JustSandbox.exe!boost::filesystem::path_traits::convert(const wchar_t * from, const wchar_t * from_end, std::basic_string<char,std::char_traits<char>,std::allocator<char> > & to, const std::codecvt<wchar_t,char,int> & cvt) Line 197 C++
JustSandbox.exe!boost::filesystem::path::string(const std::codecvt<wchar_t,char,int> & cvt) Line 373    C++
JustSandbox.exe!boost::filesystem::path::string() Line 367  C++
JustSandbox.exe!`anonymous namespace'::make_permissions(const boost::filesystem::path & p, unsigned long attr) Line 514 C++
JustSandbox.exe!boost::filesystem::detail::status(const boost::filesystem::path & p, boost::system::error_code * ec) Line 1677  C++
JustSandbox.exe!boost::filesystem::status(const boost::filesystem::path & p, boost::system::error_code & ec) Line 282   C++
JustSandbox.exe!boost::filesystem::detail::create_directories(const boost::filesystem::path & p, boost::system::error_code * ec) Line 920   C++
JustSandbox.exe!boost::filesystem::create_directories(const boost::filesystem::path & p) Line 399   C++
JustSandbox.exe!boost::log::v2s_mt_nt5::sinks::`anonymous namespace'::file_collector::store_file(const boost::filesystem::path & src_path) Line 666 C++
JustSandbox.exe!boost::log::v2s_mt_nt5::sinks::text_file_backend::rotate_file() Line 1262   C++
JustSandbox.exe!boost::log::v2s_mt_nt5::sinks::text_file_backend::~text_file_backend() Line 1083    C++
[External Code]
JustSandbox.exe!boost::detail::sp_ms_deleter<boost::log::v2s_mt_nt5::sinks::text_file_backend>::destroy() Line 65   C++
JustSandbox.exe!boost::detail::sp_ms_deleter<boost::log::v2s_mt_nt5::sinks::text_file_backend>::operator()(boost::log::v2s_mt_nt5::sinks::text_file_backend * __formal) Line 88 C++
JustSandbox.exe!boost::detail::sp_counted_impl_pd<boost::log::v2s_mt_nt5::sinks::text_file_backend *,boost::detail::sp_ms_deleter<boost::log::v2s_mt_nt5::sinks::text_file_backend> >::dispose() Line 154   C++
JustSandbox.exe!boost::detail::sp_counted_base::release() Line 103  C++
JustSandbox.exe!boost::detail::shared_count::~shared_count() Line 375   C++
[External Code]
JustSandbox.exe!boost::detail::sp_ms_deleter<boost::log::v2s_mt_nt5::sinks::synchronous_sink<boost::log::v2s_mt_nt5::sinks::text_file_backend> >::destroy() Line 61 C++
JustSandbox.exe!boost::detail::sp_ms_deleter<boost::log::v2s_mt_nt5::sinks::synchronous_sink<boost::log::v2s_mt_nt5::sinks::text_file_backend> >::operator()(boost::log::v2s_mt_nt5::sinks::synchronous_sink<boost::log::v2s_mt_nt5::sinks::text_file_backend> * __formal) Line 88  C++
JustSandbox.exe!boost::detail::sp_counted_impl_pd<boost::log::v2s_mt_nt5::sinks::synchronous_sink<boost::log::v2s_mt_nt5::sinks::text_file_backend> *,boost::detail::sp_ms_deleter<boost::log::v2s_mt_nt5::sinks::synchronous_sink<boost::log::v2s_mt_nt5::sinks::text_file_backend> > >::dispose() Line 154    C++
JustSandbox.exe!boost::detail::sp_counted_base::release() Line 103  C++
JustSandbox.exe!boost::detail::shared_count::~shared_count() Line 375   C++
[External Code]
JustSandbox.exe!boost::log::v2s_mt_nt5::core::~core() Line 415  C++
[External Code]
JustSandbox.exe!boost::checked_delete<boost::log::v2s_mt_nt5::core>(boost::log::v2s_mt_nt5::core * x) Line 34   C++
JustSandbox.exe!boost::detail::sp_counted_impl_p<boost::log::v2s_mt_nt5::core>::dispose() Line 78   C++
JustSandbox.exe!boost::detail::sp_counted_base::release() Line 103  C++
JustSandbox.exe!boost::detail::shared_count::~shared_count() Line 375   C++
[External Code]

Есть идеи, что не так с этим кодом?

PS: я использую boost 1.54.0 с Visual Studio Express 2013 Preview для Windows Desktop.

Изменить: Я думаю, что это может быть просто какая-то ошибка, но перед отправкой трекера решил найти, может быть, что-то не так с моим кодом, и я не знаю, что-то важное (я просто новичок с boost).

1

Решение

Вот это да. У меня точно такая же ошибка и трассировка стека при выходе. Я думал, что это ошибка в моем коде. (Использование Visual Studio 2013 и Boost 1_55_0)

Просто изменив «.» в имени цели, чтобы какой-то другой символ делает это работает. Спасибо за чаевые.

Как в:

//This does not work:
sink->locked_backend()->set_file_collector(sinks::file::make_collector(
keywords::target = "/log/%Y_%m_%d-%H_%M_%S_dbg.log",
...
));

//This works:
sink->locked_backend()->set_file_collector(sinks::file::make_collector(
keywords::target = "/log/%Y_%m_%d-%H_%M_%S_dbg_log",
...
));

Вы, вероятно, должны сделать этот отчет об ошибке.

2

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

я нашел этот ссылка в документации, что это обходной путь.

Для меня это сработало:

int main(int argc, char* argv[])
{
// ...

logging::core::get()->remove_all_sinks();

return 0;
}
0

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