From 5efcf8894930dfbc399fbe4e63cf73b822730b95 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 4 Aug 2026 10:32:12 +0200 Subject: [PATCH] #14446 Initialize loggers before reading cloud config files Cloud services are configured from RiaApplication::initialize(), which runs before the subclasses append their logger instances. All messages from the cloud config file search were therefore dropped. Add a virtual initializeLoggers() called before the cloud configuration is read, and move creation of the file logger and the std out logger into the overrides. The message panel logger depends on the main windows, and is still created in RiaGuiApplication::initialize(). Do not write fields with IO disabled to the application store, mirroring the check already present when reading. This stops the cloud service configuration from being persisted into the user preferences file. --- .../Application/RiaApplication.cpp | 10 ++++++--- .../Application/RiaApplication.h | 4 ++++ .../Application/RiaConsoleApplication.cpp | 10 +++++++-- .../Application/RiaConsoleApplication.h | 1 + .../Application/RiaGuiApplication.cpp | 21 ++++++++++++------- .../Application/RiaGuiApplication.h | 2 ++ .../cafPdmXml/cafPdmSettings.cpp | 3 +++ 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index 5aeaa342c0..2bb6405649 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -1697,6 +1697,13 @@ void RiaApplication::initialize() m_preferences->initAfterReadRecursively(); applyPreferences(); + // Parse log level early so it's available when the loggers are created + parseLogLevelFromQtArguments(); + + // Create loggers before reading the cloud configuration, to make sure the messages from the config file search + // are reported + initializeLoggers(); + RiaConnectorTools::configureCloudServices(); // Start with a project @@ -1710,9 +1717,6 @@ void RiaApplication::initialize() RiaCafLoggingManager::initializeCafLogging(); initializeDataLoadController(); - - // Parse log level early so it's available before logger is created in subclass initialize() - parseLogLevelFromQtArguments(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaApplication.h b/ApplicationLibCode/Application/RiaApplication.h index 80c0e60898..78c64615af 100644 --- a/ApplicationLibCode/Application/RiaApplication.h +++ b/ApplicationLibCode/Application/RiaApplication.h @@ -233,6 +233,10 @@ protected: static std::vector defaultDeprecations(); protected: + // Create the logger instances required to report messages during application startup. Called from initialize() + // before any startup configuration is read, to make sure messages from the startup sequence are logged. + virtual void initializeLoggers() {} + void initializeDataLoadController(); void parseLogLevelFromQtArguments(); diff --git a/ApplicationLibCode/Application/RiaConsoleApplication.cpp b/ApplicationLibCode/Application/RiaConsoleApplication.cpp index 6d9049669c..abf076a6e0 100644 --- a/ApplicationLibCode/Application/RiaConsoleApplication.cpp +++ b/ApplicationLibCode/Application/RiaConsoleApplication.cpp @@ -109,6 +109,14 @@ void RiaConsoleApplication::initialize() RiaApplication::initialize(); + m_socketServer = new RiaSocketServer( this ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::initializeLoggers() +{ auto logger = std::make_unique(); // Use command line log level if provided, otherwise use preference-based level @@ -122,8 +130,6 @@ void RiaConsoleApplication::initialize() } RiaLogging::appendLoggerInstance( std::move( logger ) ); - - m_socketServer = new RiaSocketServer( this ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaConsoleApplication.h b/ApplicationLibCode/Application/RiaConsoleApplication.h index 4137347e7d..695eafb606 100644 --- a/ApplicationLibCode/Application/RiaConsoleApplication.h +++ b/ApplicationLibCode/Application/RiaConsoleApplication.h @@ -46,6 +46,7 @@ public: protected: // Protected implementation specific overrides + void initializeLoggers() override; void invokeProcessEvents( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) override; void onProjectOpeningError( const QString& errMsg ) override; void onProjectOpened() override; diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index a493e3ebf2..6f66dcf694 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -551,16 +551,23 @@ void RiaGuiApplication::initialize() RiaLogging::appendLoggerInstance( std::move( logger ) ); } - { - auto logFolder = QDir::homePath() + "/.resinsight/logs"; - auto fileLogger = std::make_unique( logFolder.toStdString() ); - fileLogger->setLevel( int( RiaLogging::logLevelBasedOnPreferences() ) ); - - RiaLogging::appendLoggerInstance( std::move( fileLogger ) ); - } m_socketServer = new RiaSocketServer( this ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::initializeLoggers() +{ + // The message panel logger requires the main windows, and is created in initialize(). The file logger has no + // such dependency, and is created here to capture messages from the early startup sequence. + auto logFolder = QDir::homePath() + "/.resinsight/logs"; + auto fileLogger = std::make_unique( logFolder.toStdString() ); + fileLogger->setLevel( int( RiaLogging::logLevelBasedOnPreferences() ) ); + + RiaLogging::appendLoggerInstance( std::move( fileLogger ) ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaGuiApplication.h b/ApplicationLibCode/Application/RiaGuiApplication.h index 21bc588d15..3969e69283 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.h +++ b/ApplicationLibCode/Application/RiaGuiApplication.h @@ -126,6 +126,8 @@ public: void showFormattedTextInMessageBoxOrConsole( const QString& errMsg ) override; protected: + void initializeLoggers() override; + bool notify( QObject* receiver, QEvent* event ) override; // use the checkWithUserBeforeClose function, to get all checks in one go diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmSettings.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmSettings.cpp index 3e4f50f61f..6f66ab2a91 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmSettings.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmSettings.cpp @@ -131,6 +131,9 @@ void PdmSettings::writeFieldsToApplicationStore( const caf::PdmObjectHandle* obj if ( children.empty() ) { + // Do not write value if field is not writable + if ( fieldHandle->xmlCapability() && !fieldHandle->xmlCapability()->isIOWritable() ) continue; + if ( caf::PdmValueField* valueField = dynamic_cast( fieldHandle ) ) { settings.setValue( context + fieldHandle->keyword(), valueField->toQVariant() );