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() );