ターゲット パスがドット ('.') で始まる場合、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;
}
Engine のインスタンスを作成する前 (およびロガーを作成する前) に SetupLog を呼び出すと、正しく動作します。また、ターゲットを「_log」(先頭にドットなし) に変更した場合、またはターゲットの行をまったく省略してキーワードへのパスを含めた場合でも、作成されたログは修正されます::file_name:
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: Windows デスクトップ用の Visual Studio Express 2013 Preview で boost 1.54.0 を使用しています。
編集:これは単なるバグかもしれないと思いますが、トラッカーに送信する前に、コードに何か問題がある可能性があり、重要なことを知りませんでした(私はブーストでかなり初心者です)。