diff --git a/source/MRMesh/MRLog.cpp b/source/MRMesh/MRLog.cpp index 561773eb3975..678010398993 100644 --- a/source/MRMesh/MRLog.cpp +++ b/source/MRMesh/MRLog.cpp @@ -35,26 +35,12 @@ void Logger::removeSink( const spdlog::sink_ptr& sink ) std::filesystem::path Logger::getLogFileName() const { - if ( !logger_ ) - return {}; - - for ( const auto& sink : logger_->sinks() ) - { - if ( auto r = std::dynamic_pointer_cast( sink ) ) - return r->filename(); - if ( auto r = std::dynamic_pointer_cast( sink ) ) - return r->filename(); - if ( auto r = std::dynamic_pointer_cast( sink ) ) - return r->filename(); - if ( auto r = std::dynamic_pointer_cast( sink ) ) - return r->filename(); - if ( auto r = std::dynamic_pointer_cast( sink ) ) - return r->filename(); - if ( auto r = std::dynamic_pointer_cast( sink ) ) - return r->filename(); - } + return logFilePath_; +} - return {}; +void Logger::setLogFilePath( const std::filesystem::path& path ) +{ + logFilePath_ = path; } Logger::Logger() diff --git a/source/MRMesh/MRLog.h b/source/MRMesh/MRLog.h index 9039ea6fa433..2728c5eacc1f 100644 --- a/source/MRMesh/MRLog.h +++ b/source/MRMesh/MRLog.h @@ -36,9 +36,13 @@ class MR_BIND_IGNORE Logger /// return filename of first found file sink, if there is no one, returns {} MRMESH_API std::filesystem::path getLogFileName() const; + + /// set the current log file path (used when file sink is created) + MRMESH_API void setLogFilePath( const std::filesystem::path& path ); private: Logger(); std::shared_ptr logger_; + std::filesystem::path logFilePath_; }; /// \} diff --git a/source/MRMesh/MRSystem.cpp b/source/MRMesh/MRSystem.cpp index 0a0fc1a009d4..c915526a99db 100644 --- a/source/MRMesh/MRSystem.cpp +++ b/source/MRMesh/MRSystem.cpp @@ -607,6 +607,17 @@ void setupLoggerByDefault() std::time_t t = std::chrono::system_clock::to_time_t( now ); auto fileName = GetTempDirectory(); fileName /= "Logs"; + // ensure Logs directory exists (spdlog does not create parent dirs) + { + std::error_code ec; + if ( !std::filesystem::is_directory( fileName, ec ) ) + { + ec.clear(); + std::filesystem::create_directories( fileName, ec ); + if ( ec ) + spdlog::error( "Failed to create logs directory {}: {}", utf8string( fileName ), systemToUtf8( ec.message() ) ); + } + } removeOldLogs( fileName ); fileName /= fmt::format( "MRLog_{:%Y-%m-%d_%H-%M-%S}_{}.txt", LocaltimeOrZero( t ), @@ -616,6 +627,7 @@ void setupLoggerByDefault() file_sink->set_level( minLevel ); file_sink->set_pattern( Logger::instance().getDefaultPattern() ); Logger::instance().addSink( file_sink ); + Logger::instance().setLogFilePath( fileName ); #ifdef _WIN32 auto msvc_sink = std::make_shared();