/*! * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * \copyright \n * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, \n * IN PART OR IN WHOLE, \n * WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. \n * * \file logger.h * \date 2019/09/30 * \author Behrouz NematiPour * */ #pragma once // Qt #include #include #include // Project #include "main.h" #include "storageglobals.h" // Define #define _Logger Storage::Logger::I() #define LOG_EVENT(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogEvent) #define LOG_ERROR(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogError) #define LOG_DATUM(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogDatum) // forward declarations class tst_logging; namespace Storage { /*! * \brief The Logger class * * \note * PLEASE BE CAREFUL THIS CLASS IS USING QtConcurrent::run * IT MEANS ANY OTHER CALL WILL BE DONE IN MAIN THREAD * AND ONLY PRIVATE VOID LOG (,) IS CALLING IN POOLED THREAD * PLEASE BE VERY CAREFUL AND DO NOT ADD SIGNAL/SLOTS OR ANY OTHER FUNCTION CALLS. * ALL THE OTHER CLASSES TO USE THIS CLASS SHOULD ONLY USE LOG_DATUM, LOG_EVENT, LOG_ERROR TO LOG */ class Logger : public QObject { Q_OBJECT // friends friend class ::tst_logging; public: enum LogType { eLogEvent, eLogError, eLogDatum, }; private: QDir _dir; QHash _logPathNames; QHash _logBasePathNames { { eLogEvent, "log/event/" }, { eLogError, "log/error/" }, { eLogDatum, "log/event/" }, // "log/datum/" }; QHash _logPrefix { { eLogEvent, "Event" }, { eLogError, "Error" }, { eLogDatum, "Datum" }, }; const char *_dateFormat = "yyyy_MM_dd"; const char *_timeFormat = "HH:mm:ss"; const char *_prefixSeparator = ": " ; const char *_dateSeparator = "_" ; const char *_timeSeparator = " , "; QString _logFileName = ""; QFutureWatcher _exportWatcher; QThread *_thread = nullptr; bool _init = false; // Singleton SINGLETON(Logger) public slots: bool init(); bool init(QThread &vThread); private slots: void quit(); private: void initConnections(); void initThread(QThread &vThread); void quitThread(); private: // ----- setting up void checkLogPath (); void setLogBasePath (bool vUseApplicationDirPath = false); bool setLogPath (); bool setLogPath (LogType vLogType); // ----- Export structure public slots: bool concurrentExport(); private slots: void onExport(); signals: void didExport(); // ----- logging structure private slots: void onLog(const QString &vContent, LogType vLogType); private: void log (const QString &vContent, LogType vLogType); signals: void didLog (const QString &vContent, LogType vLogType); }; }