1 #ifndef TLOGGER_H 2 #define TLOGGER_H 3 4 #include <QDebug> 5 #include <QFile> 6 #include <QMutexLocker> 7 8 9 #define TLOG_OPEN(x,y) TLogger::getInstance()->openLog(x,y); 10 #define TLOG_PRINT(y,z) TLogger::getInstance()->printLog(y,z); 11 12 class TLogger 13 { 14 private: 15 TLogger() 16 { 17 qDebug() << "Singleton construction"; 18 } 19 20 TLogger(const TLogger&); 21 TLogger& operator = (const TLogger&); 22 23 class TGC 24 { 25 public: 26 TGC() 27 { 28 qDebug() << "TGC construction"; 29 } 30 ~TGC() 31 { 32 qDebug() << "TGC destruction, m_pInstance=" << m_pInstance; 33 if(m_pInstance) 34 { 35 m_pInstance->clearFile(); 36 37 delete m_pInstance; 38 m_pInstance = 0; 39 qDebug() << "TLogger destruction"; 40 } 41 qDebug() << "TGC destruction, m_pInstance=" << m_pInstance; 42 } 43 }; 44 45 static TLogger* m_pInstance; 46 static TGC m_garbage_collection; 47 static QMutex m_mutex; 48 QMap<QString, QFile*> m_files; 49 public: 50 static TLogger* getInstance() 51 { 52 qDebug() << "m_pInstance =" << m_pInstance; 53 if(0==m_pInstance) 54 { 55 QMutexLocker lock(&m_mutex); 56 m_pInstance = new TLogger(); 57 } 58 qDebug() << "m_pInstance =" << m_pInstance; 59 60 return m_pInstance; 61 } 62 63 void openLog(const QString& path, const QString& alias) 64 { 65 if(!m_files.contains(alias)) 66 { 67 QFile* file = new QFile(path); 68 if(file->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) 69 { 70 m_files.insert(alias, file); 71 } 72 } 73 } 74 75 void printLog(const QString& alias, const QString& data) 76 { 77 if(m_files.contains(alias)) 78 { 79 QMutexLocker lock(&m_mutex); 80 QFile* file = m_files[alias]; 81 if(file && file->isOpen()) 82 { 83 QTextStream out(file); 84 out << data << endl; 85 } 86 } 87 } 88 89 void clearFile() 90 { 91 for(QFile* file : m_files.values()) 92 { 93 if(file) 94 { 95 file->close(); 96 delete file; 97 } 98 } 99 } 100 }; 101 102 #include <QThread> 103 class QThreadLog : public QThread 104 { 105 protected: 106 void run() 107 { 108 for(int i=0;i<10000;i++) 109 { 110 QString id = QString::number((quint64)currentThreadId()); 111 QString file = QString("d:/11__%1.txt").arg(id); 112 TLOG_OPEN(file, id); 113 TLOG_PRINT(id, "abcdefghijklmnopqrstuvwxyz"+id); 114 usleep(10); 115 } 116 } 117 }; 118 119 class QLogTest 120 { 121 public: 122 void forTest() 123 { 124 for(int i=0;i<10;i++) 125 { 126 QThreadLog* t = new QThreadLog(); 127 if(t) 128 { 129 t->start(); 130 } 131 } 132 } 133 }; 134 135 #endif // TLOGGER_H
1 #include "tlogger.h" 2 3 TLogger* TLogger::m_pInstance = 0; 4 TLogger::TGC TLogger::m_garbage_collection; 5 QMutex TLogger::m_mutex;