2013-08-08 2 views
1

У меня есть некоторые проблемы с boost :: log, когда целевой путь начинается с точки ('.'). Вот мой код (simplicated, но компилируется):Необработанное исключение из 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 (и до создания регистратора), то он будет работать правильно. Также журнал будет скорректированный создан, если я сменю цель «_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 для Windows Desktop.

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

ответ

2

Wow. У меня есть такая же ошибка и трассировка стека при выходе. Я думал, что это ошибка в моем коде. (Использование 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", 
... 
)); 

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

0

Я нашел this ссылка на документацию, что это способ решения проблемы.

Что это сработало для меня было:

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

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

    return 0; 
}