diff --git a/debian/changelog b/debian/changelog index 2f45e2f0c..05ee77e23 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ sdrangel (3.8.3-1) unstable; urgency=medium * ChannelAnalyzerNG: fixed GUI displays when channel sample rate changes * SSB demod: fixed low cutoff channel marker display * LimeSDR: increased start/stop stream wait time to 50ms + * New logging system with optional copy to files -- Edouard Griffiths, F4EXB Sun, 12 Nov 2017 18:14:18 +0100 diff --git a/logging/filelogger.cpp b/logging/filelogger.cpp index 9c8300612..b967337e1 100644 --- a/logging/filelogger.cpp +++ b/logging/filelogger.cpp @@ -19,6 +19,18 @@ using namespace qtwebapp; void FileLogger::refreshSettings() { mutex.lock(); + + if (useQtSettings) { + refreshQtSettings(); + } else { + refreshFileLogSettings(); + } + + mutex.unlock(); +} + +void FileLogger::refreshQtSettings() +{ // Save old file name for later comparision with new settings QString oldFileName=fileName; @@ -49,12 +61,41 @@ void FileLogger::refreshSettings() close(); open(); } - mutex.unlock(); } +void FileLogger::refreshFileLogSettings() +{ + // Save old file name for later comparision with new settings + QString oldFileName = fileLoggerSettings.fileName; + + // Load new config settings + + fileName = fileLoggerSettings.fileName; + + // Convert relative fileName to absolute, based on the current working directory + if (QDir::isRelativePath(fileName)) + { + fileName = QFileInfo(QDir::currentPath(), fileName).absoluteFilePath(); + } + + maxSize = fileLoggerSettings.maxSize; + maxBackups = fileLoggerSettings.maxBackups; + msgFormat = fileLoggerSettings.msgFormat; + timestampFormat = fileLoggerSettings.timestampFormat; + minLevel = fileLoggerSettings.minLevel; + bufferSize = fileLoggerSettings.bufferSize; + + // Create new file if the filename has been changed + if (oldFileName != fileName) + { + fprintf(stderr,"Logging to %s\n",qPrintable(fileName)); + close(); + open(); + } +} FileLogger::FileLogger(QSettings* settings, const int refreshInterval, QObject* parent) - : Logger(parent) + : Logger(parent), useQtSettings(true) { Q_ASSERT(settings!=0); Q_ASSERT(refreshInterval>=0); @@ -68,6 +109,20 @@ FileLogger::FileLogger(QSettings* settings, const int refreshInterval, QObject* refreshSettings(); } +FileLogger::FileLogger(const FileLoggerSettings& settings, const int refreshInterval, QObject* parent) + : Logger(parent), useQtSettings(false) +{ + Q_ASSERT(refreshInterval>=0); + fileLoggerSettings = settings; + file=0; + if (refreshInterval>0) + { + refreshTimer.start(refreshInterval,this); + } + flushTimer.start(1000,this); + refreshSettings(); +} + FileLogger::~FileLogger() { diff --git a/logging/filelogger.h b/logging/filelogger.h index f195e67a5..a870b9aa8 100644 --- a/logging/filelogger.h +++ b/logging/filelogger.h @@ -13,6 +13,7 @@ #include #include "logglobal.h" #include "logger.h" +#include "fileloggersettings.h" namespace qtwebapp { @@ -64,6 +65,14 @@ public: */ FileLogger(QSettings* settings, const int refreshInterval=10000, QObject* parent = 0); + /** + Constructor. + @param settings Configuration settings as a simple structure (see: FileLoggerSettings). + @param refreshInterval Interval of checking for changed config settings in msec, or 0=disabled + @param parent Parent object + */ + FileLogger(const FileLoggerSettings& settings, const int refreshInterval=10000, QObject* parent = 0); + /** Destructor. Closes the file. */ @@ -96,6 +105,9 @@ private: /** Pointer to the configuration settings */ QSettings* settings; + /** Pointer to the configuration settings */ + FileLoggerSettings fileLoggerSettings; + /** Output file, or 0=disabled */ QFile* file; @@ -105,6 +117,9 @@ private: /** Timer for flushing the file I/O buffer */ QBasicTimer flushTimer; + /** Use of Qt settings or simple structure settings */ + bool useQtSettings; + /** Open the output file */ void open(); @@ -120,6 +135,16 @@ private: */ void refreshSettings(); + /** + Refreshes the configuration settings with Qt settings. + */ + void refreshQtSettings(); + + /** + Refreshes the configuration settings with file log settings structure. + */ + void refreshFileLogSettings(); + }; } // end of namespace diff --git a/logging/fileloggersettings.h b/logging/fileloggersettings.h new file mode 100644 index 000000000..8daee5ca1 --- /dev/null +++ b/logging/fileloggersettings.h @@ -0,0 +1,42 @@ +/* + * fileloggersettings.h + * + * Created on: Nov 11, 2017 + * Author: f4exb + */ + +#ifndef LOGGING_FILELOGGERSETTINGS_H_ +#define LOGGING_FILELOGGERSETTINGS_H_ + +#include + +namespace qtwebapp { + +struct FileLoggerSettings +{ + QString fileName; + long maxSize; + int maxBackups; + QString msgFormat; + QString timestampFormat; + QtMsgType minLevel; + int bufferSize; + + FileLoggerSettings() { + resetToDefaults(); + } + + void resetToDefaults() { + fileName = "logging.log"; + maxSize = 1000000; + maxBackups = 2; + msgFormat = "{timestamp} {type} {msg}"; + timestampFormat = "dd.MM.yyyy hh:mm:ss.zzz"; + minLevel = QtDebugMsg; + bufferSize = 100; + } +}; + +} // end of namespace + +#endif /* LOGGING_FILELOGGERSETTINGS_H_ */