@@ -176,8 +176,9 @@ namespace mtconnect::configuration {
176176 cerr << " Loading configuration from:" << *path << endl;
177177
178178 m_configFile = fs::canonical (*path);
179- addPathFront (m_configPaths, m_configFile.parent_path ());
180- addPathBack (m_dataPaths, m_configFile.parent_path ());
179+ m_configPath = m_configFile.parent_path ();
180+ addPathFront (m_configPaths, m_configPath);
181+ addPathBack (m_dataPaths, m_configPath);
181182
182183 ifstream file (m_configFile.c_str ());
183184 std::stringstream buffer;
@@ -598,6 +599,7 @@ namespace mtconnect::configuration {
598599 auto &rotationLogInterval = logChannel.m_rotationLogInterval ;
599600 auto &logArchivePattern = logChannel.m_logArchivePattern ;
600601 auto &logDirectory = logChannel.m_logDirectory ;
602+ auto &archiveLogDirectory = logChannel.m_archiveLogDirectory ;
601603 auto &logFileName = logChannel.m_logFileName ;
602604
603605 maxLogFileSize = ConvertFileSize (options, " max_size" , maxLogFileSize);
@@ -618,29 +620,51 @@ namespace mtconnect::configuration {
618620 auto file_name = *GetOption<string>(options, " file_name" );
619621 auto archive_pattern = *GetOption<string>(options, " archive_pattern" );
620622
623+ // Default the log directory to the configuration file path.
624+ logDirectory = m_configPath;
625+ logFileName = fs::path (file_name);
621626 logArchivePattern = fs::path (archive_pattern);
622- if (!logArchivePattern.has_filename ())
627+
628+ // Determine the log directory based on the provided file name and archive pattern
629+ if (logFileName.is_absolute ())
630+ logDirectory = logFileName.parent_path ();
631+ else if (logArchivePattern.is_absolute ())
632+ logDirectory = logArchivePattern.parent_path ();
633+
634+ // If the log file name is relative and has a parent path, use it to determine the log directory
635+ if (logFileName.is_relative () && logFileName.has_parent_path ())
623636 {
624- logArchivePattern = logArchivePattern / archiveFileName (get<string>(options[" file_name" ]));
637+ logDirectory = logDirectory / logFileName.parent_path ();
638+ logFileName = logFileName.filename ();
639+ }
640+ else if (logArchivePattern.is_relative () && logArchivePattern.has_parent_path ())
641+ {
642+ logDirectory = logDirectory / logArchivePattern.parent_path ();
643+ logArchivePattern = logArchivePattern.filename ();
625644 }
626645
627- if (logArchivePattern.is_relative ())
628- logArchivePattern = fs::current_path () / logArchivePattern;
646+ // Make sure the log archive pattern includes a file name, use the default file name as the
647+ // base.
648+ if (!logArchivePattern.has_filename ())
649+ logArchivePattern = logArchivePattern / archiveFileName (get<string>(options[" file_name" ]));
629650
630- // Get the log directory from the archive path.
631- logDirectory = logArchivePattern. parent_path ();
651+ // Make the logArchivePattern and logFileName absolute paths
652+ logDirectory = logDirectory. lexically_normal ();
632653
633- // If the file name does not specify a log directory, use the
634- // archive directory
635- logFileName = fs::path (file_name);
636- if (!logFileName.has_parent_path ())
654+ if (logArchivePattern.is_relative ())
655+ logArchivePattern = logDirectory / logArchivePattern;
656+ logArchivePattern = logArchivePattern.lexically_normal ();
657+ archiveLogDirectory = logArchivePattern.parent_path ();
658+ fs::create_directories (archiveLogDirectory);
659+
660+ if (logFileName.is_relative ())
637661 logFileName = logDirectory / logFileName;
638- else if ( logFileName.is_relative ())
639- logFileName = fs::current_path () / logFileName;
662+ logFileName = logFileName.lexically_normal ();
663+ fs::create_directories ( logFileName. parent_path ()) ;
640664
641665 // Create a text file sink
642666 auto sink = boost::make_shared<text_sink>(
643- kw::file_name = logFileName, kw::target_file_name = logArchivePattern.filename (),
667+ kw::file_name = logFileName. string () , kw::target_file_name = logArchivePattern.string (),
644668 kw::auto_flush = true , kw::rotation_size = logRotationSize,
645669 kw::open_mode = ios_base::out | ios_base::app, kw::format = formatter);
646670
@@ -649,7 +673,8 @@ namespace mtconnect::configuration {
649673
650674 // Set up where the rotated files will be stored
651675 sink->locked_backend ()->set_file_collector (logr::sinks::file::make_collector (
652- kw::target = logDirectory, kw::max_size = maxLogFileSize, kw::max_files = max_index));
676+ kw::target = archiveLogDirectory.string (), kw::max_size = maxLogFileSize,
677+ kw::max_files = max_index));
653678
654679 if (rotationLogInterval > 0 )
655680 {
@@ -1248,7 +1273,8 @@ namespace mtconnect::configuration {
12481273 }
12491274 catch (exception &e)
12501275 {
1251- LOG (info) << " Cannot load plugin " << name << " from " << path << " Reason: " << e.what ();
1276+ LOG (debug) << " Plugin " << name << " from " << path << " not found, Reason: " << e.what ()
1277+ << " , trying next path if available." ;
12521278 }
12531279 }
12541280
0 commit comments