]> vaikene.ee Git - evaf/commitdiff
Changes and fixes to the iLogger interface:
authorEnar Väikene <enar@vaikene.net>
Wed, 15 Feb 2012 12:41:47 +0000 (14:41 +0200)
committerEnar Väikene <enar@vaikene.net>
Wed, 15 Feb 2012 12:41:47 +0000 (14:41 +0200)
* The default source is now created separately and exists always
* Uses the ${APPNAME}.ini file to initialize the default source
* Implemented reading settings from the logger.ini file.

src/libs/Common/globals.cpp
src/libs/Common/ilogger.h
src/libs/Common/logger.cpp
src/libs/Common/logger.h
src/libs/Common/version.h
src/libs/version_rc.h

index 02aedd84d37a26a93ee8683b85213c1e8da2fe3a..5054bd1e05c71f1d4d8093277e564d7b3240a67f 100644 (file)
@@ -3,7 +3,7 @@
  * @brief Global constants and macros for eVaf
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
@@ -47,12 +47,6 @@ bool eVaf::Common::init()
         if (!app->init())
             return false;
     }
-    eVaf::Common::Internal::Logger * logger =
-            qobject_cast<eVaf::Common::Internal::Logger *>(eVaf::Common::iLogger::instance());
-    if (logger) {
-        if (!logger->init())
-            return false;
-    }
     eVaf::Common::Internal::Config * config =
             qobject_cast<eVaf::Common::Internal::Config *>(eVaf::Common::iConfig::instance());
     if (config) {
@@ -65,6 +59,12 @@ bool eVaf::Common::init()
         if (!prop->init())
             return false;
     }
+    eVaf::Common::Internal::Logger * logger =
+            qobject_cast<eVaf::Common::Internal::Logger *>(eVaf::Common::iLogger::instance());
+    if (logger) {
+        if (!logger->init())
+            return false;
+    }
 
     EVAF_INFO("%s-Globals initialized", VER_MODULE_NAME_STR);
 
index 71dbd14cd9a34c9133449f2923ea04ec62f7b4aa..c89f9213b472b1a8763779697d0bde8d847fb97e 100644 (file)
@@ -3,7 +3,7 @@
  * @brief Logger interface for eVaf
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
@@ -93,6 +93,8 @@ public:
      *
      * Use the setDefaultSource() function to change the default source name. If not set, then
      * uses the default source name "common".
+     *
+     * Changing the name of the default source resets any other settings set for the default source.
      */
     virtual void setDefaultSource(QString const & source) = 0;
 
index 01d56876f9caa0e4bbedc53d33be751a7b0a6956..809670a6f86f67faf5f08c946b9ddcb82166a54c 100644 (file)
@@ -3,7 +3,7 @@
  * @brief iLogger interface implementation
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
@@ -20,6 +20,9 @@
 #include "logger.h"
 #include "iregistry.h"
 #include "iapp.h"
+#include "iconfig.h"
+#include "globals.h"
+#include "inifile.h"
 #include "version.h"
 
 #include <QtCore>
@@ -75,16 +78,36 @@ LoggerSource::LoggerSource()
 
 LoggerSource::LoggerSource(LoggerSource const & o)
     : QSharedData()
+    , name(o.name)
     , severity(o.severity)
+    , fileName(o.fileName)
     , maxSize(o.maxSize)
     , maxCount(o.maxCount)
 {}
 
-void LoggerSource::init(QString const & source, QString const & logDir, QString const & etcDir)
+void LoggerSource::init(QString const & source)
 {
-    Q_UNUSED(etcDir);
-
-    fileName = logDir + source + ".log";
+    name = source;
+    fileName = iApp::instance()->logDir() + source + ".log";
+
+    // Set default settings
+    severity = iLogger::Fatal;
+    maxSize = 100 * 1024;
+    maxCount = 3;
+
+    // Read settings from the 'logger.ini' file
+    QString confFileName = iApp::instance()->etcDir() + "logger.ini";
+    if (QFile::exists(confFileName)) {
+        IniFile ini(confFileName, QIODevice::ReadOnly);
+
+        // Default values for all sources
+        maxSize = 1024 * ini.getValue(".default/log_size", maxSize / 1024).toInt();
+        maxCount = ini.getValue(".default/log_count", maxCount).toInt();
+
+        // Default values for this source
+        maxSize = 1024 * ini.getValue(source.toLatin1() + "/log_size", maxSize / 1024).toInt();
+        maxCount = ini.getValue(source.toLatin1() + "/log_count", maxCount).toInt();
+    }
 }
 
 
@@ -104,6 +127,9 @@ void renameBackupFile(QDir & dir, QString const & baseName, int idx)
 
 void LoggerWorker::writeToLogFile(LoggerSource const & src, QString const & msg)
 {
+    //::printf("writeToLogFile(\'%s\', \'%s\') fileName = \'%s\'\n", qPrintable(src.name), qPrintable(msg), qPrintable(src.fileName));
+    if (src.fileName.isEmpty())
+        return;
     QFile f(src.fileName);
     QFile::OpenMode mode;
 #ifdef Q_OS_LINUX
@@ -144,9 +170,9 @@ void LoggerWorker::writeToLogFile(LoggerSource const & src, QString const & msg)
 
 Logger::Logger()
     : iLogger()
+    , mReady(false)
     , mFatalMsgHandler(defFatalMsgHandler)
     , mConsoleSeverity(iLogger::Fatal)
-    , mDefaultSource("evaf")
     , mThread(0)
     , mWorker(0)
 {
@@ -154,6 +180,10 @@ Logger::Logger()
 
     qRegisterMetaType<LoggerSource>("LoggerSource");
 
+    // Create the default source
+    mDefaultSource = new LoggerSource;
+    mDefaultSource->name = "common";
+
     write(Info, QString("%1 created").arg(objectName()), 0, printf("%s:%s:%d", __FILE__, __FUNCTION__, __LINE__));
 }
 
@@ -183,6 +213,20 @@ bool Logger::init()
     // Clear existing sources in case the application was restarted
     mSources.clear();
 
+    // Set the default source name to the name of the application
+    setDefaultSource(iApp::instance()->name());
+
+    // Read configuration parameters from the application's INI file
+    QVariant v = iConfig::instance()->getValue(QString("%1/general/log_level").arg(iApp::instance()->name()), severity());
+    if (v.isValid())
+        setSeverity(iLogger::Severity(qBound(int(iLogger::None), v.toInt(), int(iLogger::Debug))));
+    v = iConfig::instance()->getValue(QString("%1/general/log_size").arg(iApp::instance()->name()), maxSize());
+    if (v.isValid())
+        setMaxSize(v.toUInt());
+    v = iConfig::instance()->getValue(QString("%1/general/log_cnt").arg(iApp::instance()->name()), maxCount());
+    if (v.isValid())
+        setMaxCount(v.toUInt());
+
     // Destroy the previous worker thread
     if (mWorker) {
         delete mWorker;
@@ -200,14 +244,23 @@ bool Logger::init()
     mThread->start(QThread::IdlePriority);
     connect(this, SIGNAL(writeToLogFile(LoggerSource,QString)), mWorker, SLOT(writeToLogFile(LoggerSource,QString)), Qt::QueuedConnection);
 
+    mReady = true;
+
     write(Info, QString("%1 initialized").arg(objectName()), 0, printf("%s:%s:%d", __FILE__, __FUNCTION__, __LINE__));
 
     return true;
 }
 
+QString Logger::defaultSource() const
+{
+    return mDefaultSource->name;
+}
+
 void Logger::setDefaultSource(QString const & source)
 {
-    mDefaultSource = source;
+    LoggerSource * src = getSource();
+    if (src && src->name != source)
+        getSource(QString())->init(source);
 }
 
 iLogger::Severity Logger::severity(QString const & source)
@@ -227,7 +280,7 @@ uint Logger::maxSize(QString const & source)
 
 void Logger::setMaxSize(uint maxSize, QString const & source)
 {
-    getSource(source)->maxSize = maxSize;
+    getSource(source)->maxSize = maxSize * 1024;
 }
 
 uint Logger::maxCount(QString const & source)
@@ -262,46 +315,30 @@ void Logger::write(Severity severity, QString const & msg, QString const & sourc
         return;
 
     // Write to the log file
-    LoggerSource * src = getSource(source);
-    if (severity <= src->severity && src->severity != iLogger::None) {
-        QString buf;
-        QTextStream io(&buf);
+    if (mReady) {
+        LoggerSource * src = getSource(source);
+        if (severity <= src->severity && src->severity != iLogger::None) {
+            QString buf;
+            QTextStream io(&buf);
 
-        // Date/time stamp
-        io << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
+            // Date/time stamp
+            io << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
 
-        // Severity
-        io << " " << severityText[severity];
+            // Severity
+            io << " " << severityText[severity];
 
-        // Message
-        io << msg;
+            // Message
+            io << msg;
 
-        // Location in the source file
-        if (!where.isEmpty())
-            io << " (occurred in " << where << ")";
+            // Location in the source file
+            if (!where.isEmpty())
+                io << " (occurred in " << where << ")";
 
-        io << endl;
-        io.flush();
+            io << endl;
+            io.flush();
 
-        // If the worker is initialized, use the worker thread to do the job
-        if (mWorker) {
             emit writeToLogFile(*src, buf);
         }
-        // Otherwise we have to do it ourselves
-        else {
-            QFile f(src->fileName);
-            QFile::OpenMode mode;
-#ifdef Q_OS_LINUX
-            mode = QFile::Append | QFile::Text | QFile::Unbuffered;
-#else
-            mode = QFile::Append | QFile::Text;
-#endif
-
-            if (f.open(mode)) {
-                f.write(buf.toLocal8Bit());
-                f.close();
-            }
-        }
     }
 
     // Output to the console
@@ -436,6 +473,9 @@ FatalMsgHandler Logger::installFatalMsgHandler(FatalMsgHandler newHandler)
 
 LoggerSource * Logger::getSource(QString const & source)
 {
+    if (source.isEmpty() || source == mDefaultSource->name)
+        return mDefaultSource.data();
+
     QHash<QString, QExplicitlySharedDataPointer<LoggerSource> >::const_iterator it = mSources.constFind(source);
     if (it != mSources.constEnd())
         return it->data();
@@ -445,7 +485,7 @@ LoggerSource * Logger::getSource(QString const & source)
         mSources.insert(source, src);
 
         // Initialize the new source
-        src->init(source.isEmpty() ? mDefaultSource : source, iApp::instance()->logDir(), iApp::instance()->etcDir());
+        src->init(source);
 
         return src.data();
     }
index 1dfdc62408a805f0ed985b93b36eb638898bbdc8..6e49ef723bcbd621fb65206045a1e671d4ff889c 100644 (file)
@@ -3,7 +3,7 @@
  * @brief iLogger interface implementation
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
@@ -54,8 +54,6 @@ public:
     /**
      * Initializes the source
      * @param source Name of the source
-     * @param logDir Full path to the log directory
-     * @param etcDir Full path to the configuration files directory
      *
      * This function initializes the newly created logger source and sets initial
      * parameters for the source.
@@ -73,25 +71,28 @@ public:
      * Example logger.ini file:
      * @code
      * [.default]
-     * severity = Fatal
-     * maxSize = 100
-     * maxCount = 3
+     * log_level = Fatal
+     * log_size = 100
+     * log_count = 3
      *
      * [my-source]
-     * severity = Warning
-     * maxSize = 1000
-     * maxCount = 10
+     * log_level = Warning
+     * log_size = 1000
+     * log_count = 10
      * @endcode
      */
-    void init(QString const & source, QString const & logDir, QString const & etcDir);
+    void init(QString const & source);
 
 
 public: // Members (we don't bother adding getter/setter functions)
 
+    /// Name of the source
+    QString name;
+
     /// Current severity level
     iLogger::Severity severity;
 
-    /// Current log file name
+    /// File name
     QString fileName;
 
     /// Current maximum size of log files
@@ -142,7 +143,7 @@ public:
     virtual ~Logger();
 
     /**
-     * Initializes the interface implementation
+     * Initializes the iLogger interface implementation
      * @return True if ok; false if initialization failed
      */
     bool init();
@@ -151,7 +152,7 @@ public:
         iLogger interface
     */
 
-    virtual QString defaultSource() const { return mDefaultSource; }
+    virtual QString defaultSource() const;
 
     virtual void setDefaultSource(QString const & source);
 
@@ -187,16 +188,19 @@ signals:
 
 private: // Members
 
+    /// Flag indicating that logger is fully initialized
+    bool mReady;
+
     /// Current fatal error message handler
     FatalMsgHandler mFatalMsgHandler;
 
     /// Console output severity level
     iLogger::Severity mConsoleSeverity;
 
-    /// Current default source (defaults to "evaf")
-    QString mDefaultSource;
+    /// Default logger source
+    QExplicitlySharedDataPointer<LoggerSource> mDefaultSource;
 
-    /// Logger sources
+    /// Other logger sources
     QHash<QString, QExplicitlySharedDataPointer<LoggerSource> > mSources;
 
     /// Worker thread
@@ -209,7 +213,7 @@ private: // Members
 private: // Methods
 
     /// Returns the source by the name. The source is created if it does not exist yet.
-    LoggerSource * getSource(QString const & name);
+    LoggerSource * getSource(QString const & name = QString());
 
 #ifdef Q_OS_WIN32
     /// Changes text colors on the Windows console
index 0a5f465a20d0c765289d353a2d8839f272f2bd18..dbc0b8934872cf224556b919214c6f4d8ace70c2 100644 (file)
@@ -3,7 +3,7 @@
  * @brief Version information for eVaf modules
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
 /**
  * Module/library version number in the form major,minor,release,build
  */
-#define VER_FILE_VERSION                0,2,3,12
+#define VER_FILE_VERSION                0,2,4,13
 
 /**
  * Module/library version number in the string format (shall end with \0)
  */
-#define VER_FILE_VERSION_STR            "0.2.3.12\0"
+#define VER_FILE_VERSION_STR            "0.2.4.13\0"
 
 /**
  * Module/library name (shall end with \0)
index b74e6c744e124a98fb49f948a456f20bb35556e6..ed8a20fddd2eb814039174c6af5a613b55a98275 100644 (file)
@@ -3,7 +3,7 @@
  * @brief Global version information for eVaf applications and modules
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
@@ -52,7 +52,7 @@
  * Legal copyright (shall end with \0)
  */
 #ifndef VER_LEGAL_COPYRIGHT_STR
-#  define VER_LEGAL_COPYRIGHT_STR       "(C) 2011 Enar Vaikene\0"
+#  define VER_LEGAL_COPYRIGHT_STR       "(C) 2011-2012 Enar Vaikene\0"
 #endif
 
 /**