Guest User

LoggerStream

a guest
Jul 14th, 2013
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.82 KB | None | 0 0
  1. #ifndef LOGGERSTREAM_H
  2. #define LOGGERSTREAM_H
  3.  
  4. #include "dll_logger_global.h"
  5.  
  6. #include <QObject>
  7. #include <QTextStream>
  8. #include <QFile>
  9. #include <QMutex>
  10. #include <iostream>
  11.  
  12. // enum for log levels
  13. enum LogLevels {
  14.     LOG_INFO = 0,
  15.     LOG_DEBUG1,
  16.     LOG_DEBUG2,
  17.     LOG_DEBUG3,
  18.     LOG_WARNING,
  19.     LOG_CRITICAL
  20. };
  21.  
  22. // logger stream class
  23. class LOGGERSHARED_EXPORT LoggerStream : public QObject
  24. {
  25.     Q_OBJECT
  26.  
  27.     QTextStream _fileStream;
  28.     QFile _logFile;
  29.     bool _isOpen;
  30.     QString _fileName;
  31.  
  32. public:
  33.     static LoggerStream *instance();
  34.     LoggerStream& operator () (LogLevels level); // log levels input
  35.     template <typename T>
  36.     LoggerStream& operator << (const T& input); // template input
  37.     LoggerStream& operator << (QVariant input);  // QVariant input
  38.     LoggerStream& operator << (QString input); // QString input
  39.     LoggerStream& operator << (int input);  // integer input
  40.     LoggerStream& operator << (unsigned int input);  // unsigned integer input
  41.     LoggerStream& operator << (float input);  // float input
  42.     LoggerStream& operator << (double input);  // double input
  43.     LoggerStream& operator << (char *input);  // string input
  44.     LoggerStream& operator << (std::string input);  // integer input
  45.     LoggerStream& operator << (std::ostream& (*pfn)(std::ostream&));  // input endl
  46.     void setFileName(QString fileName);
  47.     QString fileName();
  48.     bool open();
  49.     bool isOpen();
  50.     void commit();
  51.  
  52. private:
  53.     LoggerStream(QObject *parent = 0);
  54.     ~LoggerStream();
  55.     LoggerStream& operator = (const LoggerStream&);
  56.     QString logLevelString(LogLevels level);
  57.     void streamData(QString text);
  58.  
  59.     static LoggerStream *_instance;
  60. };
  61.  
  62. #endif // LOGGERSTREAM_H
  63.  
  64.  
  65. #include "loggerstream.h"
  66.  
  67. #include <QTime>
  68. #include <QDebug>
  69.  
  70. // static instance of class
  71. LoggerStream* LoggerStream::_instance = NULL;
  72.  
  73. /*
  74. //  class constructor
  75. */
  76. LoggerStream::LoggerStream(QObject *parent) :
  77.     QObject(parent)
  78. {
  79.     _isOpen = false;
  80. }
  81.  
  82. /*
  83. //  return instance of singleton (static)
  84. */
  85. LoggerStream * LoggerStream::instance()
  86. {
  87.     // create static mutex and check if the instance exists
  88.     static QMutex _instanceMutex;
  89.     if (_instance == NULL){
  90.         _instanceMutex.lock();
  91.         if (_instance == NULL)
  92.             _instance = new LoggerStream;
  93.         _instanceMutex.unlock();
  94.     }
  95.     // return the instance of the singleton
  96.     return _instance;
  97. }
  98.  
  99. /*
  100. //  set the file name (public function)
  101. */
  102. void LoggerStream::setFileName(QString fileName)
  103. {
  104.     _fileName = fileName;
  105. }
  106.  
  107. /*
  108. //  return file name (public function)
  109. */
  110. QString LoggerStream::fileName()
  111. {
  112.     return _fileName;
  113. }
  114.  
  115. /*
  116. //  open the file (public function)
  117. */
  118. bool LoggerStream::open()
  119. {
  120.     // check if it already open
  121.     if (_isOpen)
  122.         return true;
  123.  
  124.     // set attributes and open
  125.     _logFile.setFileName(_fileName);
  126.     if (!_logFile.open(QIODevice::WriteOnly | QIODevice::Truncate)){
  127.         qDebug() << "failed to open file";
  128.         return false;
  129.     }
  130.  
  131.     // open success
  132.     _fileStream.setDevice(&_logFile);
  133.     _isOpen = true;
  134.     return true;
  135. }
  136.  
  137. /*
  138. //  commit the log file (public function)
  139. */
  140. void LoggerStream::commit()
  141. {
  142.     // close the stream file
  143.     _fileStream.flush();
  144.     _logFile.close();
  145.     _isOpen = false;
  146. }
  147.  
  148. /*
  149. //  open status (public function)
  150. */
  151. bool LoggerStream::isOpen()
  152. {
  153.     return _isOpen;
  154. }
  155.  
  156. /*
  157. //  log level input argument (public function)
  158. */
  159. LoggerStream& LoggerStream::operator () (LogLevels level)
  160. {
  161.     // check if file is open
  162.     if (!_isOpen)
  163.         return *this;
  164.  
  165.     // create date / time stamp
  166.     QTime time = QTime::currentTime();
  167.     QDateTime dateTime = QDateTime::currentDateTime();
  168.  
  169.     // create log string including the log level output
  170.     QString headerString = dateTime.date().toString() + " " + QVariant(time.hour()).toString() + " " + QVariant(time.minute()).toString()
  171.             + " " + QVariant(time.second()).toString() + " " + QVariant(time.msec()).toString() + " " + logLevelString(level);
  172.  
  173.     // stream the data into the QTextStream
  174.     QString fileText = QString("[") + headerString + QString("]: ");
  175.     streamData(fileText);
  176.     return *this;
  177. }
  178.  
  179. /*
  180. //  template input (public function)
  181. */
  182. template <typename T>
  183. LoggerStream& LoggerStream::operator << (const T& input)
  184. {
  185.     // check if file is open
  186.     if (!_isOpen)
  187.         return *this;
  188.  
  189.     // stream data
  190.     streamData(QVariant(input).toString());
  191.     return *stream;
  192. }
  193.  
  194. /*
  195. //  QVariant input (public function)
  196. */
  197. LoggerStream& LoggerStream::operator << (QVariant input)
  198. {
  199.     // check if file is open
  200.     if (!_isOpen)
  201.         return *this;
  202.  
  203.     // stream data
  204.     streamData(input.toString());
  205.     return *this;
  206. }
  207.  
  208. /*
  209. //  QString input (public function)
  210. */
  211. LoggerStream& LoggerStream::operator << (QString input)
  212. {
  213.     // check if file is open
  214.     if (!_isOpen)
  215.         return *this;
  216.  
  217.     // stream data
  218.     streamData(input);
  219.     return *this;
  220. }
  221.  
  222. /*
  223. //  integer input (public function)
  224. */
  225. LoggerStream& LoggerStream::operator << (int input)
  226. {
  227.     // check if file is open
  228.     if (!_isOpen)
  229.         return *this;
  230.  
  231.     // stream data
  232.     streamData(QVariant(input).toString());
  233.     return *this;
  234. }
  235.  
  236. /*
  237. //  unsigned integer input (public function)
  238. */
  239. LoggerStream& LoggerStream::operator << (unsigned int input)
  240. {
  241.     // check if file is open
  242.     if (!_isOpen)
  243.         return *this;
  244.  
  245.     // stream data
  246.     streamData(QVariant(input).toString());
  247.     return *this;
  248. }
  249.  
  250. /*
  251. //  float input (public function)
  252. */
  253. LoggerStream& LoggerStream::operator << (float input)
  254. {
  255.     // check if file is open
  256.     if (!_isOpen)
  257.         return *this;
  258.  
  259.     // stream data
  260.     streamData(QVariant(input).toString());
  261.     return *this;
  262. }
  263.  
  264. /*
  265. //  double input (public function)
  266. */
  267. LoggerStream& LoggerStream::operator << (double input)
  268. {
  269.     // check if file is open
  270.     if (!_isOpen)
  271.         return *this;
  272.  
  273.     // stream data
  274.     streamData(QVariant(input).toString());
  275.     return *this;
  276. }
  277.  
  278. /*
  279. //  string input (public function)
  280. */
  281. LoggerStream& LoggerStream::operator << (char *input)
  282. {
  283.     // check if file is open
  284.     if (!_isOpen)
  285.         return *this;
  286.  
  287.     // stream data
  288.     streamData(QVariant(input).toString());
  289.     return *this;
  290. }
  291.  
  292. /*
  293. //  string input (public function)
  294. */
  295. LoggerStream& LoggerStream::operator << (std::string input)
  296. {
  297.     // check if file is open
  298.     if (!_isOpen)
  299.         return *this;
  300.  
  301.     // stream data
  302.     streamData(QString(input.c_str()));
  303.     return *this;
  304. }
  305.  
  306. /*
  307. //  endl input (public function)
  308. */
  309. LoggerStream& LoggerStream::operator << (std::ostream& (*pfn)(std::ostream&))
  310. {
  311.     // unused variable
  312.     Q_UNUSED(pfn);
  313.  
  314.     // check if file is open
  315.     if (!_isOpen)
  316.         return *this;
  317.  
  318.     // stream data
  319.     streamData("\n");
  320.     return *this;
  321. }
  322.  
  323. /*
  324. //  write data to file (private function)
  325. */
  326. void LoggerStream::streamData(QString text)
  327. {
  328.     // check if the file is open
  329.     if (_isOpen){
  330.         static QMutex fileMutex;
  331.         fileMutex.lock();   // lock
  332.         _fileStream << text;    // stream the text
  333.         _fileStream.flush();    // flush data into file
  334.         fileMutex.unlock(); // unlock
  335.     }
  336. }
  337.  
  338. /*
  339. //  log level to string (private function)
  340. */
  341. QString LoggerStream::logLevelString(LogLevels level)
  342. {
  343.     switch (level) {
  344.     case LOG_WARNING: return "LOG_WARNING";
  345.     case LOG_INFO: return "LOG_INFO";
  346.     case LOG_CRITICAL: return "LOG_CRITICAL";
  347.     case LOG_DEBUG1: return "LOG_DEBUG1";
  348.     case LOG_DEBUG2: return "LOG_DEBUG2";
  349.     case LOG_DEBUG3: return "LOG_DEBUG3";
  350.     default: return "UNKNOWN";
  351.     };
  352. }
  353.  
  354. /*
  355. //  class destructor
  356. */
  357. LoggerStream::~LoggerStream()
  358. {
  359.     // commit the file
  360.     commit();
  361.  
  362.     // delete the instance
  363.     delete _instance;
  364. }
Add Comment
Please, Sign In to add comment